У меня есть некоторый код 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.