Как запустить файл с параметром
Обновлено: 21.11.2024
В этой статье вы узнаете о трех способах выполнения программ Python и других программ из программы Python.
Оглавление
Способ 1: выполнение файла с подпроцессом
Задача: в Python иногда вам нужно выполнить другой файл, сценарий или программу из вашей собственной программы Python и предоставить аргументы.
Существует несколько способов сделать это, но я считаю, что наиболее простым является импорт "подпроцесса".
Иногда аргументы командной строки могут быть сложными, и составить список аргументов непросто. Я рекомендую поиграть с библиотекой shlex в интерактивном терминале, пока вы не освоите ее. Вам это не понадобится в рабочем коде, но может помочь сделать концепцию более понятной.
Если после выполнения этих шагов вы по-прежнему пытаетесь выполнить команду, рассмотрите следующее: используйте полный путь к файлу, который должен быть выполнен (например, /home/user/script.py или C:\Program Files). \Python 3.9\python.exe ), проверка прав доступа к файлу, который вы пытаетесь выполнить, чтобы убедиться, что он действительно является исполняемым, проверка на опечатки или чувствительность к регистру.
- Импортируйте модуль подпроцесса
- Подготовьте аргументы командной строки в формате списка
- Модуль shlex может помочь в разборе сложных командных строк.
В приведенном выше примере список каталогов, сгенерированный командой ls -l, будет хранить текст, возвращенный stdout, в output.stdout . Команда печати отобразит этот вывод на экране. Захват вывода выполненных подпроцессов позволит вам включить эту обратную связь в вашу программу. Например, если ваш код создает каталог для пользователя, теперь вы можете проверить, существует ли этот каталог, прежде чем пытаться создать его снова!
Теперь, когда мы рассмотрели, как выполнить файл с аргументами, как мы можем сами создать скрипт Python, который обрабатывает аргументы командной строки?
Способ 2: выполнение файла Python с аргументами с использованием sys.argv
Чтобы передать аргументы вашему скрипту Python, вам потребуется импортировать модуль sys. Как только этот модуль будет импортирован в ваш код, после выполнения будет существовать файл sys.argv, содержащий список всех аргументов, переданных вашему сценарию.
Рассмотрите следующий сценарий:
Если мы запустим этот скрипт из командной строки с python3 args.py arg1 arg2 , он вернет:
Обратите внимание, что, несмотря на то, что сценарию были предоставлены только два аргумента, перечислены три аргумента. Элемент 0 списка всегда является именем самого скрипта. Если пользователь переименует скрипт на своей конечной точке, sys.argv[0] отразит это имя.
Часто при написании программы на Python важно знать, сколько аргументов передается сценарию для проверки ошибок. Если пользователь указал недостаточно параметров, может быть предоставлено полезное сообщение об ошибке с инструкциями по использованию.
Рассмотрите следующий код:
Этот блок кода проверит, передан ли программе хотя бы один аргумент, и, если нет, выведет полезное сообщение об ошибке. Затем он будет перебирать список аргументов, проверяя «-f». Если этот аргумент был передан, программа напечатает наше «Hello Finxter!» сообщение!
Это грубый и элементарный способ обработки аргументов командной строки. Подводя итог:
- Импортируйте системный модуль
- Доступ к аргументам по определенному индексу, например sys.argv[1]
- Цикл for может помочь вам, если ваши пользователи размещают аргументы не по порядку.
Еще одна вещь, которую следует учитывать, это то, что Python также имеет модуль с именем argparse, который позволяет нам делать больше с аргументами командной строки в более читаемом виде, а также легко обрабатывать необязательные и позиционные параметры.
Теперь, когда вы знаете, как включить аргументы командной строки в свой скрипт, как их использовать, если вы используете интегрированную среду разработки, например PyCharm?
Способ 3: выполнение файла Python с аргументами в PyCharm
В среде разработки PyCharm верхняя панель инструментов будет содержать вкладку "Выполнить". Нажмите на него и выберите «Редактировать конфигурации». Появится новое окно, в котором вы сможете ввести необходимые параметры для выполнения вашего скрипта.
Это работает так же, как и передача аргументов через командную строку.
Почему Finxter?
"Дайте мне достаточно длинный рычаг [. ], и я переверну мир." 🌍 - Архимед
Finxter стремится быть вашим рычагом! Наша единственная цель — увеличить коллективный интеллект человечества с помощью учебных пособий по программированию, чтобы вы могли использовать бесконечный вычислительный интеллект для своего успеха! 🧠
Учебные ресурсы
Присоединяйтесь к нашей бесплатной академии электронной почты с более чем 1000 руководств по Python, фрилансу, науке о данных и машинному обучению, а также технологии блокчейн!
Python предоставляет модуль getopt, который помогает анализировать параметры и аргументы командной строки.
Модуль sys Python обеспечивает доступ к любым аргументам командной строки через файл sys.argv. Это служит двум целям —
sys.argv — это список аргументов командной строки.
len(sys.argv) — количество аргументов командной строки.
Здесь sys.argv[0] — это программа, т.е. имя сценария.
Пример
Рассмотрите следующий скрипт test.py —
Теперь запустите приведенный выше скрипт следующим образом:
Это дает следующий результат —
ПРИМЕЧАНИЕ. Как упоминалось выше, первым аргументом всегда является имя скрипта, и оно также учитывается в количестве аргументов.
Анализ аргументов командной строки
Python предоставляет модуль getopt, который помогает анализировать параметры и аргументы командной строки. Этот модуль предоставляет две функции и исключение для включения синтаксического анализа аргументов командной строки.
метод getopt.getopt
Этот метод анализирует параметры командной строки и список параметров. Ниже приведен простой синтаксис для этого метода —
Вот подробная информация о параметрах —
args — это список аргументов для анализа.
options — это строка букв опций, которую скрипт хочет распознать, а опции, требующие аргумента, должны сопровождаться двоеточием (:).
long_options — это необязательный параметр, и если он указан, он должен быть списком строк с именами длинных параметров, которые должны поддерживаться. После длинных опций, требующих аргумента, должен следовать знак равенства ('='). Чтобы принимать только длинные параметры, параметры должны быть пустой строкой.
Этот метод возвращает значение, состоящее из двух элементов: первый представляет собой список пар (параметр, значение). Второй — это список аргументов программы, оставшихся после удаления списка опций.
Каждая возвращаемая пара "опция-значение" содержит опцию в качестве первого элемента, перед которой ставится дефис для коротких опций (например, "-x") или два дефиса для длинных опций (например, "--long-option" ).
Исключение getopt.GetoptError
Это происходит, когда в списке аргументов обнаруживается нераспознанный параметр или когда параметру, требующему аргумента, не задано значение none.
Аргументом исключения является строка, указывающая причину ошибки. Атрибуты msg и opt содержат сообщение об ошибке и соответствующий параметр.
Пример
Представьте, что мы хотим передать два имени файла через командную строку, и мы также хотим дать возможность проверить использование скрипта. Использование сценария выглядит следующим образом —
Я хочу запустить команду в Python Shell для выполнения файла с аргументом.
Например: execfile("abc.py"), но как добавить 2 аргумента?
Я знаю, что это старый вопрос, но вы могли бы поочередно передавать значения для запуска py-файла в файле и просто открывать его и читать значения.
13 ответов 13
Обратите внимание, что после завершения abc.py управление будет возвращено вызывающей программе. Также обратите внимание, что abc.py может вызвать quit(), если он действительно завершен.
Когда мой 'abc.py' имеет argparse для анализа входных аргументов, я получаю сообщение об ошибке с этим методом: слишком мало аргументов. Я запустил python abc.py arg1 arg2 в терминале (этот метод работает без ошибок), а затем напечатал содержимое sys.argv и обнаружил, что sys.argv содержит имя «abc.py» в качестве первого элемента списка. . На самом деле код user2757262 ниже с sys.argv = ['abc.py','arg1', 'arg2'] работал!
На самом деле, разве мы не хотели бы сделать это?
execfile запускает файл Python, но загружает его, а не как скрипт. Вы можете передавать только привязки переменных, но не аргументы.
Если вы хотите запустить программу из Python, используйте subprocess.call . Например,
@geotheory Конечно, это работает, но это менее безопасно и становится сложно, когда вы хотите передать строки с кавычками в подпроцесс.
@marco: Идея состоит в том, что «скрипт» будет отдельным процессом с собственной командной строкой. execfile запускается в текущем процессе, поэтому (если это уместно) используется командная строка current. В этом смысле вы не можете использовать его без «передачи» аргументов!
Более интересные сценарии вы также можете найти в модуле runpy. Начиная с Python 2.7, у него есть функция run_path. Например:
Вы путаете загрузку модуля в текущий процесс интерпретатора и внешний вызов скрипта Python.
Первое можно сделать, импортировав интересующий вас файл. execfile похож на импорт, но он просто оценивает файл, а не создает из него модуль. Подобно «источнику» в сценарии оболочки.
Последнее можно сделать с помощью модуля подпроцесса. Вы создаете другой экземпляр интерпретатора и передаете ему любые параметры, которые хотите. Это похоже на выделение в сценарии оболочки с использованием обратных кавычек.
Есть ли простой способ запустить приложение из проводника Windows с аргументами? Или мне действительно нужно запускать их из командной строки?
Вы ограничены командной строкой или запуском из Проводника? Будет ли работать простой пакетный файл или ярлык?
3 ответа 3
Если вы откроете любую папку, то самый короткий способ запустить любое приложение с аргументами — это просто ввести имя программы и аргументы в верхнем текстовом поле.
В противном случае, если ваша программа находится на рабочем столе, вы можете использовать различные способы, такие как:- Нажмите на любую папку на рабочем столе, на один уровень выше, и сделайте то же самое, что показано на картинке.
- Нажмите Win+R , напишите cmd.exe /k cd desktop , нажмите Enter, напишите имя программы и аргументы.
- Создайте ярлык или пакетный файл с помощью этой команды:
cmd.exe /k cd %systemdrive%\%username%\desktop
запустите его и напишите имя программы и аргументы.
Похоже, вам нужен краткий скрипт, который можно просто дважды щелкнуть, чтобы запустить команду с определенными аргументами. Это верно? Если это так, вот один из способов:
Откройте простой текстовый редактор, например Блокнот, и введите команды с нужными аргументами, например:
(В этом примере putty.exe — это программа, которая может принимать IP-адреса в качестве аргументов и сохраняется в C:\Users\\useful-files\executables.) Когда вы закончите, сохраните ее с расширением . bat (если вы используете Блокнот, просто убедитесь, что вы заменили .txt, с которого он вас запускает; в нашем примере мы могли бы сохранить его как что-то вроде run-putty-with-IP.bat ).
Если вы сделали это правильно, в Проводнике файлов тип файла будет отображаться как "Пакетный файл Windows", и двойной щелчок по нему запустит его содержимое.
Обратите внимание, что некоторые программы, без настройки системных переменных или переменных среды, потребуют от вас перехода в их каталог, чтобы иметь возможность выполнять их, поэтому команда cd включена здесь.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
1. Введение
Ранее мы рассмотрели, как передать аргументы командной строки в сценарий bash. В этом руководстве мы рассмотрим, как мы можем использовать эти аргументы внутри скрипта bash.
Дополнительная литература:
Как передать аргументы командной строки в сценарий Bash
Как использовать команду cd в сценариях Bash
Чтение вывода команды в массив в Bash
2. Обработка ввода
Давайте рассмотрим различные способы обработки аргументов, передаваемых скрипту bash внутри скрипта.
2.1. Позиционные параметры
Аргументы, передаваемые сценарию, обрабатываются в том же порядке, в котором они были отправлены. Индексация аргументов начинается с единицы, а доступ к первому аргументу можно получить внутри скрипта с помощью $1. Точно так же ко второму аргументу можно получить доступ с помощью $2 и так далее. Позиционный параметр относится к этому представлению аргументов с использованием их позиции.
В качестве примера рассмотрим следующий скрипт userReg-positional-parameter.sh, который печатает имя пользователя, возраст и полное имя в таком порядке:
Теперь давайте запустим этот скрипт с тремя входными параметрами:
Вывод будет таким:
2.2. Флаги
Использование флагов — распространенный способ передачи входных данных в скрипт. При передаче входных данных скрипту перед каждым аргументом ставится флаг (обычно одна буква), начинающийся с дефиса (-).
Давайте рассмотрим скрипт userReg-flags.sh, который принимает три аргумента: имя пользователя (-u), возраст (-a)< /em> и полное имя (-f).
Мы изменим предыдущий скрипт, чтобы использовать флаги вместо того, чтобы полагаться на позиционные параметры. Функция getopts считывает флаги во входных данных, а OPTARG обращается к соответствующим значениям:
Давайте запустим этот скрипт с теми же входными данными, что и раньше, только на этот раз мы добавим к входным данным флаги:
Вывод такой же, как и раньше, хотя мы сместили позиции аргументов имя пользователя и полное имя:
Здесь мы используем функцию getopts для анализа флагов, предоставленных в качестве входных данных, и блок case для присвоения значения, указанного соответствующей переменной.
2.3. Циклическая конструкция
Позиционные параметры, хотя и удобны во многих случаях, не могут использоваться, когда размер ввода неизвестен. В таких ситуациях удобно использовать конструкцию цикла.
Переменная [email protected] представляет собой массив всех входных параметров. Используя эту переменную в цикле for, мы можем перебирать входные данные и обрабатывать все переданные аргументы.
Давайте рассмотрим пример скрипта users-loop.sh, который печатает все имена пользователей, которые были переданы в качестве входных данных:
Теперь запустим скрипт:
И мы увидим результат:
В приведенном выше примере мы повторяем переменную user по всему массиву входных параметров. Эта итерация начинается с первого входного аргумента, john, и продолжается до последнего аргумента, carol, даже если размер входных данных неизвестен.
2.4. Оператор смены
Оператор сдвига в bash (синтаксически shift n, где n — количество позиций для перемещения) сдвигает позицию аргументов командной строки. Значение по умолчанию для n равно единице, если оно не указано.
Оператор сдвига заставляет индексацию ввода начинаться со сдвинутой позиции. Другими словами, когда этот оператор используется для ввода массива, позиционный параметр $1 изменяется на аргумент, полученный путем сдвига n позиций вправо от текущего аргумента, привязанного к позиционный параметр $1.
Рассмотрите пример сценария, который определяет, является ли ввод нечетным или четным:
Из приведенного выше обсуждения позиционного параметра мы теперь знаем, что $1 относится к первому аргументу, который равен 13. Используя оператор сдвига с вводом 1 (shift 1) приводит к тому, что индексация начинается со второго аргумента. То есть $1 теперь относится ко второму аргументу (18). Точно так же вызов shift 2 приведет к тому, что индексация начнется с четвертого аргумента (35).
Давайте запустим скрипт с теми же входными данными, что и выше:
В этом примере мы сдвигаем позиционный параметр на каждой итерации на единицу, пока не достигнем конца ввода. Таким образом, $1 каждый раз указывает на следующий элемент во входных данных.
3. Заключение
В этой статье мы рассмотрели, как аргументы, передаваемые скрипту bash во время выполнения, могут обрабатываться внутри скрипта различными способами:
Как всегда, примеры, используемые в этой статье, доступны на GitHub.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
Читайте также: