Python - изменить рабочий каталог в синтаксисе subprocess.call - PullRequest
0 голосов
/ 09 мая 2018

У меня есть некоторый код Python, который должен вызвать скрипт .sh, который находится в другом каталоге, и передать ему пару переменных. Он находится в файле .py, который является частью пути Flask для API.

subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2)))

Это работает, если я копирую код в отдельный файл .py и запускаю его прямо из venv, когда я нахожусь в каталоге, где находится файл .py, И я включаю в этот файл строку os.chdir:

os.chdir('/path/to/sh_script_dir')

ИЛИ если я перехожу в каталог, где находится сценарий .sh, и вызываю его напрямую, используя

>> python /path/to/py_file.py

В последнем случае os.chdir не нужен. Однако, когда я вызываю его из Flask (нажимая на него путь API, как «настоящий» пользователь), я получаю:

Exception class: builtins.FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'script_name.sh' 

Эта ошибка возникает независимо от того, определяю ли я абсолютный путь к сценарию в этой строке или нет.

Я думаю, это потому, что это ultimatley вызывается из основного api.py Flask, который находится в любом рабочем каталоге, в котором он находится, и игнорирует команду os.chdir.

Я знаю, что есть другой способ сделать это с "cwd", но я не смог заставить его работать. Я перепробовал много вариантов, но ничего не работает:

subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2), cwd = '/path/to/sh_script_dir'))

subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2)), cwd = '/path/to/sh_script_dir')

subprocess.call([shlex.split('script_name.sh {} {}'.format(var1,var2))], cwd = '/path/to/sh_script_dir')

subprocess.call([shlex.split('script_name.sh {} {}'.format(var1,var2)], cwd = '/path/to/sh_script_dir'))

Нужно ли мне определять изменение рабочего каталога на один уровень выше, в маршруте Flask? Заметьте, что я не совсем уверен, что shlex.split нужен здесь, но без него он не работал, тогда он работал, поэтому я оставил его. Я могу предоставить больше кода / информации, но проблема, кажется, очень специфична для запуска этой функции, как если бы текущий рабочий каталог находился там, где находится сценарий .sh, а не скрипт .py.

1 Ответ

0 голосов
/ 09 мая 2018

Я подозреваю, что если ./ не передано subprocess, в некоторых системах команда может не быть найдена (проблемы безопасности, . не в системном пути)

Другой проблемой может быть неправильный каталог / команда, которой нет в каталоге.

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

command_dir = '/path/to/sh_script_dir'
command_file = os.path.join(command_dir,"script_name.sh")
if not os.path.isfile(command_file):
    raise Exception("{}: no such file".format(command_file))

subprocess.call([command_file,var1,var2], cwd = command_dir)
  • составьте командный файл с полным путем (хранится в переменной)
  • проверить существование полного пути перед запуском вашей команды (помогает отследить ошибку пути)
  • не используйте shlex.split, когда вместо него можно передать список аргументов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...