介绍|安装|用法|语法|设置|关于
一种工具,可以从一个文件中运行许多用多种语言编写的程序。
通常,要一次练习多个编程语言,您需要多个文件或多个项目,也许是多个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 。
在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软件包。