Вступление | Установка | Использование | Синтаксис | Настройки | О
Инструмент для запуска многих программ, написанных на многих языках из одного файла.
Обычно, чтобы практиковать несколько языков программирования одновременно, вам нужно несколько файлов или несколько проектов, возможно, несколько 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 также могут быть указаны в файле. Ман на основе на языке, и существует множество настроек, которые могут настроить, как языки запускаются и отображаются на выводе.
В целом, Runmany может быть использован для:
В целом Runmany является полезным инструментом для всех, кто хочет играть с несколькими языками программирования за раз.
Убедитесь, что у вас установлен Python версия 3.6 или выше, затем запустите
pip install runmany
в терминале, чтобы установить последний пакет Python Runmany от PYPI. Тогда runmany <filename> должен работать над запуском файлов. Ман. Смотрите больше способов использовать использование.
Runmany лучше всего работает в VSCODE с расширением Companion Runmany VSCODE, которое обеспечивает синтаксис, выделяющую для файлов. Ман и быстрые способы их запуска. Установите расширение бесплатно от рынка или запуска:
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 Runmany обеспечивает синтаксис, выделяющую для всех этих языков плюс еще несколько.
Есть способы добавить пользовательские языки и изменить поведение встроенных языков и даже сделать их различными в различных операционных системах. Для получения дополнительной информации см. Языки настройки.
Обратите внимание, что Print - это язык утилиты, который просто печатает содержимое кода в Stdout, и MIPS ожидает, что mars.jar будет в текущем рабочем каталоге.
Если pip install runmany не работал, попробуйте pip3 install runmany или python -m pip install runmany или python3 -m pip install runmany .
В Windows, если ничего не работает, вам может потребоваться убедиться, что каталоги установки Python и сценариев находятся в переменной среды вашего пути, а затем перезапустите терминал и повторите попытку.
Runmany был сделан в Python 3.9 в Windows и был тщательно протестирован на версиях Python 3.6, 3.7, 3.8, 3.9 и 3.10 в Windows. Он также должен хорошо работать на Linux и MacOS, но он был менее тщательно протестирован на этих операционных системах, особенно когда речь идет о командах, которые запускают переводчики/компиляторы других языков программирования.
Runmany теперь находится в версии 2 с улучшенным синтаксисом файлов и большим количеством настройки. Старая версия 1.0.3 все еще доступна на PYPI.
Чтобы запустить файл runmany с именем myfile.many Используйте команду терминала:
runmany myfile.many
Существуют также необязательные аргументы, чтобы получить помощь и указать настройки и выходные файлы:
runmany [-h --help] [-s --settings <settings-file>] [-o --outfile <output-file>] <input-file>
<input-file> -необходимый. Ман-файл для запуска.<settings-file> -необязательный файл .JSON, который определяет, как запускаются языки и как отформатируется вывод.<output-file> -необязательный файл для отправки вывода. При опущенной, вывод идет в stdout. Например, команда для запуска myfile.many с настройками mysettings.json и отправить вывод на myoutput.txt будет:
runmany -s mysettings.json -o myoutput.txt myfile.many
Когда файл настроек предоставляется в командной строке, любые разделы «Настройки», встроенные в входной файл, игнорируются. Если ни один из них не присутствует, или для каких -либо отсутствующих настроек, default_settings.json используется в качестве запасного. Смотрите больше информации в настройках.
Для некоторых примеров. Многие файлы и их вывод проверьте папку «Примеры» на GitHub или многочалледжах, где различные кодовые проблемы для таких сайтов, как Project Euler, решаются во многих языках одновременно.
Расширение.
Runmany может быть импортирован и использован с Python следующим образом:
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 заставит интерпретировать аргумент файла. None . Как и в случае запуска из командной строки, предоставление настройки здесь означает, что все настройки, встроенные в файл. Ман, игнорируются.
Функция runmany.cmdline , которая принимает список аргументов командной строки, также присутствует в качестве альтернативы использованию командной строки напрямую.
Формат файла. Ман - это то, что ожидает Runmany, когда будет предоставлен файл для запуска.
В основном, файл. Ман. Секция начинается с неопределенной линии заголовка, такой как Python: или Stdin for Python: затем содержание первого фрагмента - это то, что появляется после толстой кишки и на отступах внизу. Дополнительные фрагменты могут быть добавлены в раздел с нерешенным Also: заголовок, а раздел заканчивается, когда начинается новый или неожиданный End. или конец файла достигнут.
Малый файл работает сверху вниз, выполняя разделы и фрагменты в порядке, с которым они встречаются. Примечательно, что файл. Ман запускается независимо от того, есть ли в нем синтаксисные ошибки или нет. Любой неверный синтаксис будет игнорироваться и упоминаться в сообщении об ошибке.
В примере. Много файла ниже, Stdin for Python: раздел имеет два фрагмента: bar и baz , и они становятся стандартным вводом для программы Python в разделе Python: один фрагмент print('foo' + input()) . Запуск этого файла запускает программу Python дважды, один раз для bar и один раз для baz , предоставляя соответствующие выходы foobar и foobaz .
Stdin for Python:
bar
Also:
baz
End.
Python:
print('foo' + input())
End.
Прочитайте подробности обо всех синтаксисе файлов.
%% как первые непрерывные символы в строке делают комментарий до конца этой строки.
%% this is a comment
Python: %% this is not a comment
%% this is a comment
print(1) %% this is not a comment
Нет комментариев, хотя Start & Stop близки к функциональности.
Как уже упоминалось, файл. Ман. Есть четыре типа раздела:
<language>: или <language1>, <language2>, ...:Argv: или Argv for <language1>, <language2>, ...:Stdin: или Stdin for <language1>, <language2>, ...:Settings: Все, кроме раздела настройки, может иметь отдельный список запятых языков, к которым он применяется в заголовке. Эти языки, когда -то лишенные пробела, должны соответствовать ключам "name" языков в настройках JSON, но не чувствительны к случаю. (Ключевые слова, такие как «argv» и «stdin» , чувствительны к случаю. Пользовательские языки не должны использовать ключевые слова Runmany в качестве имен и не содержать символов ,:%!@ .)
Заголовок Also: используется для добавления фрагментов в раздел и End. Можно ли использоваться для завершения секции.
Содержание фрагмента - это текст после любого пробела после толстой кишки ( : в заголовке фрагмента, плюс все строки ниже, которые содержится с одним вкладом или 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])
2 3 1
Чтобы 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())
B C A
Когда несколько аргументов и stdins применяются к одному языку, все возможные комбинации каждого ARGV и каждого Stdin отправляются на программы этого языка.
Раздел «Настройки» начинается с Settings: и позволяет внедрять настройки JSON в файл. Ман, который используется до тех пор, пока не найдет другой раздел «Настройки».
Эти встроенные настройки используются только тогда, когда настройки не были специально предоставлены при вызове Runmany. Любые отсутствующие настройки по умолчанию к их значениям в default_settings.json.
Settings:
{ "show_code": true }
Python:
print('this Python code will now be shown as part of the output')
Также можно использовать строку JSON PATH to FAILEST SETPERTS, например, Settings: "path/to/mysettings.json" .
Also: заголовки фрагментов в разделах настройки являются сокращением для повторения заголовка секции. Таким образом, они не служат большой цели, поскольку они сразу перезаписывают предыдущие настройки.
Поместите !! В начале заголовка секции отключает весь раздел и все его фрагменты.
Поместите ! В начале заголовка фрагмента отключает этот фрагмент.
!!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: в начале линии само по себе в файле. Ман.
Все после первой STOP. В начале линии самостоятельно в файле. Мань игнорируется.
Итак, запускается только раздел JavaScript этого. Ман.
Python: print('unseen')
START:
JavaScript: console.log('seen')
STOP.
Python: print('unseen')
Должно быть только одно START: и одна STOP. в файле. Ман.
Настройка Runmany определяется файлом JSON, который может быть предоставлен, когда Runmany вызывается или непосредственно встроен в файл. Ман.
Настройки JSON определяют, какие языки может запустить Runmany и как он их запустит. Это также определяет, как будет отформатирован выход Runmy.
Файл default_settings.json имеет значения по умолчанию для всех настроек. Эти значения по умолчанию используются автоматически, если нет в предоставленных или встроенных настройках JSON.
Большинство настроек - это простые флаги или значения, которые могут быть установлены в базовых настройках объекта JSON, чтобы применять их по всему миру (см. Список настройки), но четыре специальных ключа в JSON используются для настройки языков, которые могут запускать или добавить больше языков. Это "languages" , "languages_windows" , "languages_linux" и "languages_mac" ( "languages_<os>" будут использоваться для обозначения последних трех). Они представляют собой массивы одноуровневых объектов JSON, которые указывают настройки для языка, который соответствует клавишу "name" объекта.
Массив "languages_<os>" , который соответствует системной ОС, имеет наивысший приоритет при определении настройки языка, за которым следует массив "languages" , за которым следует встроенные массивы "supplied_languages_<os>" и "supplied_languages" . (Эти массивы "supplied_languages..." никогда не должны быть установлены в ваших настройках JSON.) Языки используют настройки в базовом объекте JSON в качестве окончательного запасного отступления.
Например, в следующих настройках JSON устанавливает настройку "show_code" (которая по умолчанию является ложным) для всех языков, за исключением Python и Python 2. Она также создает новый язык «Python 3.10», который можно использовать в заголовке разделения файлов. Ман.
{
"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" относится к запуску файла. Ман в целом, так что это имеет смысл только в базовом объекте JSON.
Все описанные настройки и могут ли они быть переопределены на основе на языке в "languages" и "languages_<os>" объекты массива:
| JSON KEY | Тип | По умолчанию | Переопределяемый | Описание |
|---|---|---|---|---|
"command" | нить | "echo NOCOMMAND" | да | Команда консоли запустить язык, следуя формату команды. |
"extension" | нить | "" | да | Расширение файла языка, включая точку. |
"timeout" | плавать | 10.0 | да | Срок каждой программы за считанные секунды или null без ограничения по времени. |
"runs" | инт | 1 | да | Количество раз каждая программа запускается. Показан только выход последнего прогона. |
"stderr" | нить | "smart" | да | "yes" / true , чтобы объединить программу stderr с Stdout. "no" / false , чтобы скрыть программу stderr. "smart" / null , чтобы показать Stderr только тогда, когда у программ есть ненулевые коды выхода. |
"spacing" | инт | 1 | да | Количество пустых линий для добавления после каждого запуска. |
"newline" | нить | "n" | да | Какие новеньки заменяются в коде, ARGV и содержимого фрагмента STDIN. Или null по умолчанию ОС. |
"tab" | нить | "t" | да | Что заменен символ TAB в коде, 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" , Stderr. |
"show_runs" | буль | true | нет | Показан ли список прогонов. Обычно это основная часть выхода. |
"show_stats" | буль | true | нет | Показаны ли успех и сбой отказа после всего. |
"show_equal" | буль | true | нет | Сравниваются ли соответствующие Stdouts и сгруппированы после того, как все будет запущено. |
"show_errors" | буль | true | нет | Такие ошибки Runmany, как ` |
"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 , чтобы рассматривать верхнюю часть файла. Many как начало фрагмента кода, со всеми нерелевантными частями, так что ошибки в программах сообщают о правильных номерах строк. |
"strip_output" | нить | "no" | да | "yes" / true СТРЕСИТЬ ПРОГРАММЫ ВЫХОДНЫХ И ТРЕБОВАНИЙ ПОЛЕД. "no" / false , чтобы оставить вывод программы как есть. "smart" / null для разделения программы вывода пустых линий и линий следа. |
"strip_argv" упомянуть "strip_code" что части кода, "strip_stdin" и Stdin выхода файла.
Ключ "command" объекта в массиве "languages" или "languages_<os>" определяет команду терминала, которая выполняется для выполнения этого языка.
Заполнители, такие как $file и $dir можно использовать в команде для обозначения временного файла runmany создает для кода каждой программы, которую он запускает, и каталог, который хранится в файле:
| Заполнитель | Часть .../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 | / (ОС -специфическая) |
$argv | N/A - ARGV вставлен здесь |
$code | N/A - необработанное содержание фрагмента |
Обратите внимание, что некоторые заполнители «цитируются», а некоторые нет. Некоторые операционные системы, такие как Windows, могут иметь пробелы в пути к временным файлам, поэтому важно правильное цитирование.
Если $ не присутствует нигде в строке команды, к нему добавляется $file $argv . Например, командный python неявно python $file $argv .
Проверьте массив "supplied_languages" в default_settings.json для получения дополнительных примеров команд.
Я был заинтересован в том, чтобы сделать Runmany благодаря моему желанию изучить больше языков программирования, в сочетании с моим раздражением, что всякий раз, когда я пытался, мне неизменно придется создавать совершенно новый проект для этого языка или даже переключаться.
Я планирую использовать его для практики решения проблем кода на нескольких языках с таких сайтов, как Project Euler.
Проверьте некоторые другие мои пакеты Python.