介紹|安裝|用法|語法|設置|關於
一種工具,可以從一個文件中運行許多用多種語言編寫的程序。
通常,要一次練習多個編程語言,您需要多個文件或多個項目,也許是多個IDE。 Runmany是一種工具,可讓您使用所需的任何編程語言在同一文件中編寫多個程序,然後一次運行它們。
runmany使用“ .many”作為文件擴展名,例如,如果一個稱為simple.many文件具有以下內容:
Python:
print("Hi")
JavaScript:
console.log("Hi")
C:
#include <stdio.h>
int main() {
printf("Hin");
return 0;
}
然後,在終端中進行runmany simple.many將產生這種有組織的輸出,以運行Python,JavaScript和C程序:
************************************************************
1. Python
-------------------- output from line 1 --------------------
Hi
************************************************************
2. JavaScript
-------------------- output from line 4 --------------------
Hi
************************************************************
3. C
-------------------- output from line 7 --------------------
Hi
************************************************************
3/3 programs successfully run!
3/3 had the exact same stdout!
************************************************************
ARGV和STDIN也可以按語言為.MARNY文件指定,並且有許多設置可以自定義在輸出中運行和顯示語言的方式。
通常,Runmany可用於:
總體Runmany是一個有用的工具,對於想要一次使用多種編程語言的任何人來說。
確保已安裝了Python版本3.6或更高版本,然後運行
pip install runmany
在終端中安裝PYPI最新的Runmany Python軟件包。然後runmany <filename>應該工作以運行。查看更多使用方法的方法。
Runmany在Vscode中使用的伴侶Runmany Vscode擴展名最好地使用。該語法突出顯示了.MARNEN文件和運行它們的快速方法。從市場或運行中免費安裝擴展名:
code --install-extension discretegames.runmany
您還需要您希望RunMany在計算機上運行的編程語言,因為Runmany使用他們的口譯人員/編譯器在幕後實際運行程序。
Runmany對以下語言有內置的支持:
Ada, Bash, Batch, C, C#, C++, Dart, Fortran, Go, Groovy, Haskell, Java, JavaScript, Julia, Kotlin, Lisp, Lua, MIPS, Pascal, Perl, PHP, PowerShell, Print, Python, Python 2, R, Racket, Ruby, Rust, Scala, TypeScript, VBScript, and Visual Basic
意思是,如果您已經安裝了這些語言之一,那麼它很有可能會自動起作用。
Runmany Vscode擴展名提供了所有這些語言的語法突出顯示以及更多。
有多種方法可以添加自定義語言並改變內置語言的行為,甚至使它們在不同的操作系統上不同。有關更多信息,請參見自定義語言。
請注意, Print是一種實用語言,只需將代碼內容打印到stdout,而MIPS希望mars.jar在當前的工作目錄中。
如果pip install runmany不起作用,請嘗試pip3 install runmany或python -m pip install runmany python3 -m pip install runmany PIP Install Runmany 。
在Windows上,如果什麼都沒有起作用,則可能需要確保Python安裝和腳本目錄在您的路徑環境變量中,然後重新啟動終端並重試。
Runmany是在Windows上的Python 3.9中製造的,已在Windows上的Python版本3.6、3.7、3.8、3.9和3.10上進行了徹底的測試。它在Linux和MacOS上也應該很好地工作,但在這些操作系統上進行了廣泛的測試,尤其是在運行其他編程語言的口譯員/編譯器的命令時。
Runmany現在在版本2中,具有改進的.MARN文件語法和更多設置。舊的1.0.3版本仍在PYPI上可用。
運行一個名為myfile.many的運行文件。
runmany myfile.many
還有可選的參數可以獲得幫助並指定設置和輸出文件:
runmany [-h --help] [-s --settings <settings-file>] [-o --outfile <output-file>] <input-file>
<input-file>是需要運行的所需的.MARE文件。<settings-file>是可選的.json文件,它定義了語言的運行方式以及如何格式化輸出。<output-file>是將輸出發送到的可選文件。省略後,輸出將轉到Stdout。例如,使用設置mysettings.json運行myfile.many並將輸出發送到myoutput.txt是:
runmany -s mysettings.json -o myoutput.txt myfile.many
當在命令行上提供設置文件時,忽略了輸入文件中嵌入的任何設置部分。如果不存在,或者對於任何丟失的設置,則將Default_Settings.json用作後備。在設置中查看更多信息。
有關。 MALE文件及其輸出的一些示例,請檢查GitHub上的示例文件夾或ManyChallenges Repo,其中對euler項目等網站的各種代碼挑戰一次都以多種語言解決。
不需要Runmany文件的許多擴展名,但建議為了清楚起見。
可以從Python導入和使用Runmany,如下所示:
from runmany import runmany , runmanys
# Run to stdout
runmany ( 'path/to/myfile.many' , 'path/to/mysettings.json' ) # settings JSON is always optional
# Run to output file
runmany ( 'path/to/myfile.many' , 'path/to/mysettings.json' , 'path/to/myoutput.txt' )
# Run to file object
with open ( 'path/to/myoutput.txt' , 'w' ) as output_file :
runmany ( 'path/to/myfile.many' , 'path/to/mysettings.json' , output_file )
# Run to string
output_string = runmanys ( 'path/to/myfile.many' , 'path/to/mysettings.json' )
print ( output_string )在runmany.runmany和runmany.runmanys函數中, from_string=True將使.Many文件參數被解釋為字符串而不是文件路徑,並且可以將設置json參數作為.json文件或類似JSON的python dictionary的路徑,或者None設置。與從命令行運行一樣,在此處提供設置意味著嵌入在.MARY文件中的所有設置都被忽略。
獲取命令行參數列表的函數runmany.cmdline也是直接使用命令行的替代方案。
.NARY文件格式是Runmany期望運行文件時所期望的。
主要的是,一個。許多文件由每個包含一個或多個片段的部分組成。一個部分以未註明的標頭線開始,例如Python:或Stdin for Python:然後第一個片段的內容是在結腸後和下面的縮進線上出現的。還可以將附加片段添加到該部分中,並帶有一個未註明的Also:標題,當新的啟動或未註明End.或到達文件的末尾。
一個.MARE文件從上到下運行,按照遇到的順序執行部分和摘要。值得注意的是,無論是否具有語法錯誤,許多文件都將運行。任何無效的語法都將在錯誤消息中忽略和提及。
在下面的示例中。 python Stdin for Python:部分具有兩個片段, bar和baz ,它們成為Python:部分,該節目具有一個片段print('foo' + input()) 。運行此文件兩次運行Python程序,一次用於bar ,一次用於baz ,從而提供相應的foobar和foobaz 。
Stdin for Python:
bar
Also:
baz
End.
Python:
print('foo' + input())
End.
請繼續閱讀有關所有.MARN文件語法的詳細信息,或查看具有所有語法示例的語法。
%%作為行中的第一個非空格字符,直到該行結束為止。
%% this is a comment
Python: %% this is not a comment
%% this is a comment
print(1) %% this is not a comment
沒有塊註釋,儘管起步和停止的功能緊密。
如前所述,一個。許多文件由以標頭開始並包含片段開頭的部分組成。有四種類型的部分:
<language>:或<language1>, <language2>, ...:Argv:或Argv for <language1>, <language2>, ...:Stdin:或Stdin for <language1>, <language2>, ...:Settings:除了“設置”部分以外,所有其他語言都可以在標題中使用的語言分開列表。這些語言一旦被剝奪了空格,就必須匹配設置JSON中語言的"name"鍵,但不敏感。 (“ argv”和“ stdin”之類的關鍵字是案例敏感的。自定義語言不應將runmany關鍵字用作名稱,也不應包含字符,:%!@ 。)。
標題Also:用於將片段添加到部分和End.可以選擇使用來結束部分。
摘要的內容是摘要標題中的colon( :之後的任何空格之後的文本,以及下面的所有線條上都有一個標籤或4個空格(已刪除這些凹痕),直到下一個標頭或End.或文件結束。
因此此代碼部分
Python: import math
print(math.pi)
Also: print('pie')
print('cake')
有兩個內容,其內容為:
import math
print ( math . pi ) print ( 'pie' )
print ( 'cake' )部分上方或下方的空白線僅用於可讀性,而不是必需的。在各節之外的無需代碼無效。
代碼部分以逗號分開的語言列表開始,其摘要內容是以這些語言運行的程序。
逗號分隔列表中的一種語言幾乎總是足夠的
JavaScript:
console.log('Some code that will be run in JavaScript.')
Python, Python 2:
print('Some code that will be run in Python 3 then Python 2.')
Also:
print('Some more code that will be run in Python 3 then Python 2.')
Also:代碼部分中的摘要標題是重複截面標題的速記。
ARGV是參數向量,也就是發送到程序的命令行參數。
ARGV部分可以啟動Argv:應用於所有語言,或者Argv for <language1>, <language2>, ...:應用於逗號分隔列表中的語言。無論哪種方式,覆蓋這些語言的任何以前的ARGV設置。
ARGV部分中的每個片段都是一個單獨的ARGV,將依次發送到該部分適用的語言的程序。這使得一次輕鬆測試許多ARGV。
Argv: argv sent to all languages
Argv for Python: 1
Also: 2
Also: 3
Python:
import sys
print(sys.argv[1])
此。 MARNY代碼將使用ARGV 1然後2 3 python程序運行Python程序。
為了使argv工作$argv佔位符,必須正確地將其放置在語言的指揮中。
幾乎完全像一個ARGV部分,但對於標準輸入流用戶通常會輸入文本。
STDIN部分可以啟動Stdin:應用於所有語言,或Stdin for <language1>, <language2>, ...:應用於逗號分隔列表中的語言。無論哪種方式,覆蓋這些語言的任何先前的stdin設置。
STDIN部分中的每個片段都是單獨的STDIN,將依次發送到本節使用的語言的程序。這使得一次很容易一次測試許多Stdins。
Stdin: stdin sent to all languages
Stdin for Python: A
Also: B
Also: C
Python:
print(input())
此。 MARNY代碼將使用Stdin A然後B然後C運行Python程序。
當多個ARGV和STDIN適用於一種語言時,每個ARGV和每個STDIN的所有可能組合都會發送到該語言的程序。
設置部分以Settings:並允許將設置json嵌入.MARY文件中,該文件已使用,直到遇到另一個設置部分。
這些嵌入式設置僅在調用Runmany時未具體提供時才使用。在default_settings.json中,任何缺少的設置默認為其值。
Settings:
{ "show_code": true }
Python:
print('this Python code will now be shown as part of the output')
也可以使用設置文件路徑的JSON字符串,例如Settings: "path/to/mysettings.json" 。
Also:設置部分中的摘要標題是重複截面標題的速記。因此,他們沒有太多目的,因為他們立即覆蓋了先前的設置。
放!!在截面的開頭,標題禁用整個部分及其所有片段。
put !在摘要標題開始時,禁用段落。
!!Python:
print('this is disabled')
Also:
print('this is also disabled')
!Python:
print('this is disabled')
Also:
print('this is not disabled')
!Also:
print('this is disabled')
如果任何部分標題以@@開頭,則僅運行這些部分,類似於音頻/視頻編輯軟件中的“獨奏”複選框。
如果部分中的任何摘要標題以@開始,則僅在該部分運行時運行這些片段。
@@@Python:
print('this is run')
Also:
print('this is not run')
@Also:
print('this is run')
Python:
print('this is not run')
@Also:
print('this is also not run')
請注意,第一行是如何有三個@@@ ,兩個來獨奏部分,另一個是獨奏第一個片段。
最後一個START:在一條線的開始時,在一個.MARN文件中被忽略。
第一STOP.在一條線的開頭,在一個.MARN文件中被忽略。
因此,僅運行此.MARY文件的JavaScript部分:
Python: print('unseen')
START:
JavaScript: console.log('seen')
STOP.
Python: print('unseen')
只有一個START:只有一個STOP.在一個.MARY文件中。
Runmany的設置由JSON文件定義,當Runmany被調用或直接嵌入。 MARNY文件中時,該文件可以提供。
設置JSON定義了Runmany可以運行的語言以及如何運行它們。它還定義瞭如何格式化運行輸出。
文件default_settings.json保留所有設置的默認值。如果在提供或嵌入式設置JSON中不存在的話,這些默認值將自動使用。
大多數設置是可以在基本設置對像中設置的簡單標誌或值,可以在全球應用它們應用它們(請參閱設置列表),但是JSON中的四個特殊鍵用於自定義Runmany可以運行的語言或添加更多語言。這些是"languages" , "languages_windows" , "languages_linux"和"languages_mac" ( "languages_<os>"將用於參考最後三個)。它們是單級JSON對象的數組,該數組指定與對象的"name"鍵的語言的設置。
確定語言設置時,與系統OS匹配的"languages_<os>"數組在確定語言的設置時具有最高優先級,然後是"languages"數組,然後是內置的"supplied_languages_<os>"和“ SEVEND_LANGUAGES”和"supplied_languages"數組。 (這些"supplied_languages..."陣列絕不應在您的設置JSON中設置。)語言將基本JSON對像中的設置用作最終後備。
例如,以下設置JSON設置"show_code"設置(默認情況下是錯誤的),除了Python和Python 2外,所有語言都將其設置為true。它還創建了一種新的語言“ Python 3.10”,可以在Windows上的。 MARNY文件部分中使用。
{
"show_code" : true ,
"languages" : [
{ "name" : " Python " , "show_code" : false },
{ "name" : " Python 2 " , "show_code" : false }
],
"languages_windows" : [
{ "name" : " Python 3.10 " , "extension" : " .py " , "command" : " py -3.10 " }
]
}每個語言數組中的每個對像都需要"name"鍵,並且應始終為新的自定義語言提供"command"和"extension"鍵。不過,並非每個設置都有意義地按語言應用。例如, "show_equal"適用於整個.MARY文件的運行,因此僅在基本JSON對像中才有意義。
所描述的所有設置以及是否可以在"languages"和"languages_<os>"陣列對象的情況下以每語言為基礎覆蓋它們:
| JSON KEY | 類型 | 預設 | 太過了 | 描述 |
|---|---|---|---|---|
"command" | 細繩 | "echo NOCOMMAND" | 是的 | 遵循命令格式運行語言的控制台命令。 |
"extension" | 細繩 | "" | 是的 | 語言的文件擴展,包括點。 |
"timeout" | 漂浮 | 10.0 | 是的 | 每個程序的時間限制在幾秒鐘內或null時間限制。 |
"runs" | int | 1 | 是的 | 每個程序運行的次數。僅顯示上次運行的輸出。 |
"stderr" | 細繩 | "smart" | 是的 | "yes" / true程序stderr與Stdout相結合。 "no" / false隱藏程序stderr。 "smart" / null僅在程序具有非零退出代碼時顯示STDERR。 |
"spacing" | int | 1 | 是的 | 每次運行後要添加的空白行數。 |
"newline" | 細繩 | "n" | 是的 | Newlines在代碼,ARGV和STDIN片段內容中取代的內容。或默認操作系統的null 。 |
"tab" | 細繩 | "t" | 是的 | 在代碼,argv和stdin片段內容中替換了選項卡字符的內容。 |
"cwd" | 細繩 | null | 是的 | 當前的工作目錄將運行程序。可能是相對路徑。使用null或"."對於當前的工作目錄沒有更改。 |
"minimalist" | 布爾 | false | 不 | 是否以最小格式顯示所有輸出,其中劃分器,代碼,ARGV和STDIN未顯示。 |
"run_blanks" | 布爾 | false | 不 | 是否純粹由空格組成的空白段都被運行還是忽略。 |
"show_time" | 布爾 | false | 是的 | 是否顯示執行時間。與"runs"結合使用時,可用於性能測試。 |
"show_command" | 布爾 | false | 是的 | 是否顯示用於運行每個程序的命令。可用於調試新語言的命令。 |
"show_code" | 布爾 | false | 是的 | 是否顯示該程序的源代碼。 |
"show_argv" | 布爾 | true | 是的 | 是否顯示該程序的ARGV(當前)。 |
"show_stdin" | 布爾 | true | 是的 | 是否顯示該程序的stdin(當前)。 |
"show_output" | 布爾 | true | 是的 | 是否顯示該程序的輸出。這包括stdout,並取決於"stderr" 。 |
"show_runs" | 布爾 | true | 不 | 是否顯示運行列表。這通常是輸出的大部分。 |
"show_stats" | 布爾 | true | 不 | 一切都在運行後顯示成功和失敗數量。 |
"show_equal" | 布爾 | true | 不 | 在一切運行之後,是否比較並分組匹配的Stdout。 |
"show_errors" | 布爾 | true | 不 | 是否像` |
"strip_argv" | 細繩 | "smart" | 不 | "yes" / true剝離了領先和尾隨的摘要內容。 "no" / false以保持摘要內容狀態。 "smart" / null將摘要中的所有線路與空間一起加入所有線路,就好像它們在一行上一樣。 |
"strip_stdin" | 細繩 | "smart" | 不 | "yes" / true剝離純淨的線條段的開始和結尾。 "no" / false以保持摘要內容狀態。 "smart" / null執行方式與"yes" / true相同,但也附加了單個新線。 |
"strip_code" | 細繩 | "smart" | 是的 | "yes" / true剝離純淨的線條段的開始和結尾。 "no" / false以保持摘要內容狀態。 "smart" / null將。 MALER文件的頂部視為代碼段的開始,所有無關的零件都被遮擋了,因此程序中的錯誤報告了正確的行號。 |
"strip_output" | 細繩 | "no" | 是的 | "yes" / true to Strip Program輸出領先和尾隨的空格。 "no" / false以保持程序輸出。 "smart" / null到剝離程序的剝離程序輸出的空鉛和尾線輸出。 |
應該提到的是,不管"strip_code" , "strip_argv"和"strip_stdin"的值,代碼,ARGV和Stdin部分被剝離為空線以保持視覺清潔。
"languages"或"languages_<os>"數組中的對象的"command"鍵定義運行以執行該語言的終端命令。
像$file和$dir這樣的佔位符可以在命令中使用,以參考為其運行的每個程序的代碼創建的臨時文件,以及該文件存儲在以下位置:
| 佔位符 | .../dir/file.ext的部分 |
|---|---|
$rawdir | .../dir |
$dir | ".../dir" |
$rawfile | .../dir/file.ext |
$file | ".../dir/file.ext" |
$rawbranch | .../dir/file |
$branch | ".../dir/file" |
$name | file.ext |
$stem | file |
$ext | .ext |
$sep | / (特定於OS) |
$argv | n/a-在這裡插入argv |
$code | N/A-原始片段內容 |
請注意,有些佔位符被“引用”,而有些則不是。某些操作系統(例如Windows)可能在臨時文件的路徑中具有空間,因此正確的報價很重要。
如果命令字符串中的任何地方都不存在$ ,則將$file $argv附加到其中。例如,命令python隱含地是python $file $argv 。
在default_settings.json中查看"supplied_languages"數組,以獲取更多命令示例。
我的渴望學習更多編程語言的願望與我的煩惱相結合,每當我嘗試時,我總是必須為該語言製作一個全新的項目,甚至切換IDE。
我計劃使用它來練習來自Project Euler等網站的多種語言解決代碼挑戰。
查看我的其他一些Python軟件包。