Каково практическое применение модификатора% * при использовании файлов .bat для запуска сценариев .py? - PullRequest
1 голос
/ 25 апреля 2020

Недавно я узнал, как создать файл .bat для выполнения скрипта python, дважды щелкнув его. Предполагая, что мой скрипт называется foo.py, файл .bat должен выглядеть следующим образом:

python.exe C:\Users\Name\Desktop\Example\foo.py %*

Что мне трудно понять, так это последнее утверждение% *. Зачем мне это здесь? Я протестировал файл без него, и он работал нормально.

Ответ "% * передает все аргументы" мне несколько расплывчат, я читал некоторую теорию о пакетном скриптинге и понял некоторые применения модификатора , но я просто не могу связать это с делом Python. Я был бы рад, если бы кто-нибудь дал мне несколько примеров, показывающих разницу между запуском python .bat файлов с% и без% *, чтобы я наконец понял, почему это действительно нужно.

1 Ответ

2 голосов
/ 25 апреля 2020

main.cmd:

@echo off
echo batch-file_args: %*
python.exe foo.py %*

foo.py:

import sys
print('python_args:', sys.argv[1:])

Команда тестирования 1 :

main. cmd

Вывод:

batch-file_args:
python_args: []

Нет аргументов в пакетном файле, поэтому %* не определено, поэтому вы ничего не видите. Скрипт python не выводит аргументы, так как аргументы не передаются. [] - пустой список.

Тестовая команда 2 :

main.cmd 1 2 3 4

Вывод :

batch-file_args: 1 2 3 4
python_args: ['1', '2', '3', '4']

* Подставляется 1041 * и отображает все аргументы пакетного файла 1 2 3 4. Аргументы передаются в сценарий python, и он отображает ['1', '2', '3', '4'].

Таким образом, %*, переданный в сценарий python, может работать с обоими тестами выше.


Зачем мне это здесь? Я протестировал файл без него, и он работал нормально.

foo.py что у вас, вероятно, используются значения по умолчанию, если аргументы не переданы, поэтому он не жалуется.

Подумайте, есть ли в скрипте python строка типа var = sys.argv[1]. Я добавлю его в код python для проверки.

foo.py:

import sys
print('python_args:', sys.argv[1:])
var = sys.argv[1]

Команда тестирования 3 :

main.cmd

Вывод:

batch-file_args:
python_args: []
Traceback (most recent call last):
  File "foo.py", line 3, in <module>
    var = sys.argv[1]
IndexError: list index out of range

Ой, жалуется на IndexError. %* может быть важным, как указывает Traceback. Передаваемые аргументы не будут похожи на удаление %* из командного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...