Как запустить файл с аргументом

Обновлено: 04.07.2024

До сих пор мы запускали программу обычным образом, не используя при этом никаких параметров.

Но зачастую мы видим, что многие программы и утилиты, наоборот, требуют при запуске указывать параметры запуска после имени запускаемой программы. Причём данные программы не только консольные, но и с графическим интерфейсом, на которые, например, ложится ярлык на рабочий стол и в его свойствах прописываются параметры командной строки.

Думаю, что и нам пора разобраться, каким образом мы можем передавать некоторые параметры в нашу программу, чтобы она себя вела определённым образом в зависимости от их значений. Вернее даже не каким образом мы можем их передавать в программу, а каким образом наша программа сможет их обрабатывать.

Оказывается, функция main, которая вызывается при запуске программы автоматически (говорят даже, что данная функция является точкой входа в программу, хотя это не совсем так и это легко можно доказать, зайдя в отладку), тоже может иметь входные параметры (или аргументы).

До сих пор, когда нам не требовались входящие аргументы, наша функция mian() имела следующий заголовок

int main()

А чтобы функция main() увидела аргументы командной строки, то мы её объявлять должны уже с параметрами и её заголовок при этом будет выглядеть вот так

int main( int argc, char *argv[])

Также возможен ещё вот такой вариант

int main( int argc, char **argv)

Как именно пользоваться данными параметрами, мы лучше узнаем сразу в практической части, к которой сейчас и приступим.

Проект мы сделаем, как всегда, из проекта прошлого урока с именем MYPROG32 и присвоим ему имя MYPROG33.

Откроем наш проект в Eclipse, произведём его первоначальную настройку и удалим весь наш код из функции main() за исключением возврата. Функция main() приобретёт вот такой вид

int main()

return 0; //Return an integer from a function

Соответственно, заголовок функции main() мы приведём к следующему виду, добавив в него аргументы

int main( int argc, char *argv[])

Удалим все глобальные структуры, в том числе и закомментированную.

Первым делом давайте выведем в консоль количество аргументов, переданных в нашу программу с помощью параметров командной строки

В этой статье вы узнаете три способа выполнить программы Python и Non Python из программы Python.

Метод 1: выполнить файл с подпроцессором

Вызов : В Python иногда вам нужно выполнить другой файл, скрипт или программу из собственной программы Python и предоставлять аргументы.

Есть несколько способов сделать это, но я нахожу наиболее простым, чтобы быть с импортом «подпроцесса».

Иногда аргументы командной строки могут быть сложными и построены список аргументов непросто. Я рекомендую играть с Джэкс Библиотека в интерактивном терминале, пока вы не получите это. Вам не понадобится это в вашем производственном коде, но может помочь сделать концепцию более понятной.

Если после последующих следующих действий этих шагов вы все еще боретесь, чтобы получить команду выполнить, рассмотрим следующее: использование полного пути файла для выполнения (например, /home/user/script.py или c: \ Program Files \ python 3.9 \ python.exe ), проверка разрешений файла, который вы пытаетесь выполнить, чтобы убедиться, что он на самом деле выполняется исполняемым, проверкой опечатки или чувствительности к регистру.

Таким образом, шаги для выполнения файла с аргументами из скрипта Python являются:

Подготовьте свои аргументы командной строки в Список формат

  1. Джэкс Модуль может помочь с анализом сложных командных строк

В приведенном выше примере список каталогов, созданный по LS -L Команда хранит текст, возвращенный stdout внутри вывод .stutout Отказ Команда печати отобразится, что вывод на экране. Захват вывода выполненных подпроцессов позволит вам включить эту обратную связь в вашу программу. Например, если ваш код создает каталог для пользователя, теперь вы можете проверить, если этот каталог уже существует, прежде чем пытаться создать его снова!

Теперь, когда мы охватывали, как выполнить файл с аргументами, как мы можем создать сценарий Python для себя, который обрабатывает аргументы командной строки?

Способ 2: Выполните файл Python с аргументами с использованием Sys.Argv

Чтобы пройти аргументы в ваш сценарий Python, вам нужно будет импортировать sys модуль. Как только этот модуль импортируется в ваш код, при выполнении sys.argv Существуют, содержащие список всех аргументов, переданных в ваш скрипт.

Рассмотрим следующий скрипт:

Если мы запустим этот скрипт из командной строки с помощью python3 args.py arg1 arg2 это вернется:

Рассмотрим следующий код:

Это грубый и элементарный способ обработки аргументов командной строки. В итоге:

Доступ к аргументам по определенному индексу, например sys.argv [1]

  1. А для петли Может помочь вам, если ваши пользователи размещают аргументы из строя

Другое, что следует подумать, что Python также имеет модуль имени argparse Это позволяет нам делать больше аргументов командной строки более читаемыми способом, а также легко обрабатывать необязательные и позиционные параметры.

Теперь, когда вы знаете, как включить аргументы командной строки в свой скрипт, как вы их используете, если вы используете IDE, как Pycharm?

Метод 3: Выполните файл Python с аргументами в Pycharm

Внутри среды разработки PYCHARM верхняя панель инструментов будет включать вкладку запуска. Нажмите на него и выберите «Редактировать конфигурации». Вглет новое окно, которое позволит вам ввести в необходимые параметры для выполнения вашего сценария.

Как вы узнали из урока «0.4 – Введение в разработку на C++», при компиляции и компоновке программы на выходе получается исполняемый файл. Когда программа запускается, выполнение начинается с функции main() . До этого момента мы объявляли main следующим образом:

Обратите внимание, что эта версия main() не принимает параметров. Однако для работы со многими программами требуются какие-то входные данные. Например, предположим, что вы пишете программу под названием Thumbnail , которая считывает файл изображения, а затем создает миниатюру (уменьшенную версию этого изображения). Как Thumbnail узнает, какое изображение прочитать и обработать? Пользователь должен каким-то образом указать программе, какой файл открыть. Для этого вы можете использовать следующий подход:

Однако при таком подходе есть потенциальная проблема. Каждый раз, когда программа запускается, она будет ждать, пока пользователь введет данные. Это может не быть проблемой, если вы запускаете эту программу один раз вручную из командной строки. Но это проблематично в других случаях, например, когда вы хотите запустить эту программу для многих файлов или запустить ее другой программой.

Давайте рассмотрим эти случаи подробнее.

Рассмотрим случай, когда вы хотите создать миниатюры для всех файлов изображений в заданном каталоге. Как бы вы это сделали? Вы можете запускать эту программу столько раз, сколько изображений в каталоге, печатая имя каждого файла вручную. Однако если бы изображений были сотни, это могло бы занять целый день! Хорошим решением здесь было бы написать программу, которая перебирает имя каждого файла в каталоге, вызывая Thumbnail один раз для каждого файла.

Теперь рассмотрим случай, когда вы запускаете веб-сайт и хотите, чтобы на вашем сайте создавался эскиз каждый раз, когда пользователь загружает изображение на ваш сайт. Эта программа не настроена для приема входных данных из Интернета, так как же человек, загружающий файл, будет вводить имя файла в этом случае? Хорошим решением здесь было бы, чтобы ваш веб-сервер автоматически вызывал Thumbnail после загрузки.

В обоих этих случаях нам нужен способ, чтобы внешняя программа могла передавать имя файла в качестве входных данных для нашей программы Thumbnail при ее запуске, а не заставлять Thumbnail ждать после запуска, пока пользователь введет имя файла.

Аргументы командной строки – это необязательные строковые аргументы, которые операционная система передает программе при ее запуске. Затем программа может использовать их в качестве входных данных (или игнорировать). Подобно параметрам функции, которые позволяют функции предоставлять входные данные для другой функции, аргументы командной строки позволяют людям или программам предоставлять входные данные программе.

Передача аргументов командной строки

Исполняемые программы можно запускать из командной строки, вызывая их по имени. Например, чтобы запустить исполняемый файл " WordCount ", который находится в корневом каталоге диска C: на компьютере с Windows, вы можете ввести:

Чтобы передать аргументы командной строки в WordCount , мы просто перечисляем их после имени исполняемого файла:

Теперь при выполнении WordCount Myfile.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:

Это также работает и в других операционных системах командной строки, таких как Linux (хотя приглашение и структура каталогов, несомненно, будут отличаться).

Если вы запускаете свою программу из среды IDE, в среде IDE должен быть предусмотрен способ ввода аргументов командной строки.

В Microsoft Visual Studio кликните правой кнопкой мыши на своем проекте в обозревателе решений и выберите «Свойства» (Properties). В открывшемся окне разверните дерево «Свойства конфигурации» (Configuration Properties) и выберите «Отладка» (Debugging). На правой панели есть строка с названием «Аргументы команды» (Command Arguments). Вы можете ввести туда аргументы командной строки для тестирования, и они будут автоматически переданы вашей программе при ее запуске.

Задание аргументов командной строки в Microsoft Visual Studio

Рисунок 1 – Задание аргументов командной строки в Microsoft Visual Studio

В Code::Blocks выберите «Project» (Проект) → «Set program’s arguments» (Установить аргументы программы).

Задание аргументов командной строки в Code::Blocks

Рисунок 2 – Задание аргументов командной строки в Code::Blocks

Использование аргументов командной строки

Теперь, когда вы знаете, как предоставить программе аргументы командной строки, следующим шагом будет доступ к ним из нашей программы на C++. Для этого мы используем другую форму main() . Эта новая форма main() принимает два аргумента (по соглашению названные argc и argv ) следующим образом:

Иногда вы также можете увидеть и такое:

Несмотря на то, что они обрабатываются одинаково, мы предпочитаем первое представление, потому что его интуитивно легче понять.

argc – это целочисленный параметр, содержащий счетчик числа аргументов, переданных программе ( argc = argument count, число аргументов). argc всегда будет не меньше 1 потому, что первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, предоставляемый пользователем, приведет к увеличению argc на 1.

argv – это место, где хранятся фактические значения аргументов ( argv = argument values, значения аргументов, хотя на самом деле расшифровывается как «argument vectors»). Хотя объявление argv выглядит устрашающе, на самом деле argv представляет собой просто массив строк в стиле C. Длина этого массива – argc .

Давайте напишем короткую программу с именем MyArgs для вывода значений всех параметров командной строки:

Теперь, когда мы вызываем эту программу ( MyArgs ) с аргументами командной строки " Myfile.txt " и " 100 ", вывод будет следующим:

Аргумент 0 – это путь и имя текущей запущенной программы. Аргументы 1 и 2 в данном случае – это два параметра командной строки, которые мы передали.

Работа с числовыми аргументами

Аргументы командной строки всегда передаются в виде строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в качестве числа, вы должны преобразовать его из строки в число. К сожалению, C++ делает это немного сложнее, чем должно быть.

В C++ это можно сделать следующим образом:

При запуске с вводом " 567 " эта программа печатает:

std::stringstream работает так же, как std::cin . В этом случае мы инициализируем его значением argv[1] , и поэтому можем использовать operator>> для извлечения значения в целочисленную переменную (так же, как и с std::cin ).

Подробнее о std::stringstream мы поговорим в следующей главе.

Операционная система анализирует аргументы командной строки первой

Как правило, в операционных системах действуют особые правила обработки специальных символов, таких как двойные кавычки и обратный слеш.

Обычно строки, переданные в двойных кавычках, считаются частью одной строки:

Если вы хотите включить двойную кавычку в состав строки, вам нужно поставить перед двойной кавычкой обратный слеш:

Заключение

Аргументы командной строки предоставляют пользователям и другим программам отличный способ передать входные данные в программу при запуске. Рассмотрите возможность использования любых входных данных, необходимых для работы программы при запуске, в качестве параметров командной строки. Если они не будут переданы через командную строку, вы всегда можете обнаружить это и попросить пользователя ввести данные. Таким образом, ваша программа сможет работать в любом случае.

Бывает, что данные в программу передаются из командной строки при ее вызове. Такие данные называются аргументами командной строки. Выглядит это так, например:

Здесь вызываются программы a.out (из текущего каталога) и ls (из одного каталога, указанного в переменной окружения PATH). Первая программа из командной строки получает одно слово — test.txt, вторая — два: -lt и /home/peter/.

Если программа написана на языке C, то при ее запуске управление сразу передается в функцию main() , следовательно, именно она получает аргументы командной строки, которые присваиваются ее переменным-параметрам.

До этого мы определяли функцию main() так, как-будто она не принимает никакие параметры и ничего не возвращает. На самом деле в языке C любая функция по-умолчанию (если не определено ничего иного) возвращает целое число. В этом можно убедиться. Если записать код таким образом:

, то ошибки при компиляции не возникнет (но будет предупреждение). То же самое будет, если записать int main() . Это доказывает, что функция по-умолчанию возвращает целое число, а не ничто ( void ). Хотя то, что возвращает функция всегда можно "переопределить", например, voidmain() или float main() .

При вызове программы из командной строки в нее всегда передается пара данных:

  1. целое число, обозначающее количество слов (элементов, разделенных пробелами) в командной строке при вызове,
  2. указатель на массив строк, где каждая строка — это отдельное слово из командной строки.

Само имя программы также считается. Например, если вызов выглядит так:

, то первый аргумент программы имеет значение 4, а массив строк определяется как .

Обратите внимание на терминологию, есть всего два аргумента программы (число и массив), но сколько угодно аргументов командной строки. Аргументы командной строки "преобразуются" в аргументы программы (в аргументы функции main() ).

Эти данные (число и указатель) передаются в программу даже тогда, когда она просто вызывается по имени без передачи в нее чего-либо: ./a.out. В таком случае первый аргумент имеет значение 1, а второй указывает на массив, состоящий всего из одной строки .

То, что в программу передаются данные, вовсе не означает, что функция main() должна их принимать. Если функция main() определена без параметров, то получить доступ к аргументам командной строки невозможно. Хотя ничего вам не мешает их передавать. Ошибки не возникнет.

Чтобы получить доступ к переданным в программу данным, их необходимо присвоить переменным. Поскольку аргументы сразу передаются в main() , то ее заголовок должен выглядеть таким образом:

В первой переменной (n) содержится количество слов, а во второй — указатель на массив строк. Часто второй параметр записывают в виде **arr . Однако это то же самое. Вспомним, что сам массив строк, содержит в качестве своих элементов указатели на строки. А в функцию мы передаем указатель на первый элемент массива. Получается, что передаем указатель на указатель, т.е. **arr .

Напишите такую программу:

Она выводит количество слов в командной строке при ее вызове и каждое слово с новой строки. Вызовите ее без аргументов командной строки и с аргументами.

В программе мы использовали переменные-параметры argc и argv. Принято использовать именно такие имена, но на самом деле они могут быть любыми. Лучше придерживаться этого стандарта, чтобы ваши программы были более понятны не только вам, но и другим программистам.

Практическое значение передачи данных в программу

Если у вас есть опыт работы в командной строке GNU/Linux, вы знаете, что у большинства команд есть ключи и аргументы. Например, при просмотре содержимого каталогов, копировании, перемещении в качестве аргументов указываются объекты файловой системы, над которыми выполняется команда. Особенности ее выполнения определяются с помощью ключей. Например, в команде

cp — это имя команды, -r — ключ, а ../les_1 и ../les_101 — аргументы команды.

Нередко в программы при их запуске передаются адреса файлов и "модификаторы" (это ключи) процесса выполнения программы.

Напишем программу, которая открывает указанные пользователем в командной строке файлы на запись или добавление и записывает (добавляет) туда одну и туже информацию, которую пользователь вводит с клавиатуры в процессе выполнения программы:

Читайте также: