ошибка при выполнении команды с помощью подпроцесса.run()

#python #bash #scripting #subprocess

Вопрос:

Я схожу с ума.

Эта команда, выполняемая в терминале WSL1 Ubuntu 20.04 внутри Windows10, работает хорошо и создает кучу файлов в текущем каталоге, при наличии исполняемой smilei папки выше и .py внутри текущей папки.

mpirun -n 1 ../smilei namelist_Xe_GPtrial_noOAM_a0included.py

Теперь я хочу, чтобы он выполнил ту же самую команду, используя Python subprocess .

Что я делаю не так:

 particular_namelist_name = "namelist_Xe_GPtrial_noOAM_a0included.py" cp = subprocess.run(["mpirun", "-n", "1", "../smilei", particular_namelist_name], check=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  

Это приводит к ошибке:

 CalledProcessError: Command '['mpirun', '-n', '1', '../smilei', 'namelist_Xe_GPtrial_noOAM_a0included.py']' returned non-zero exit status 1.  

Я попытался отладить его, однако внутри этой папки нет ничего, кроме .py.

Я попытался использовать (для приведенной выше команды, но без значения ключевого слова check=True):

 print(cp.stdout) # prints an empty line print(cp.stderr) # prints an empty line print(cp.returncode) # prints 1   

Как я могу это отладить? Что я делаю не так? То же самое происходит и с subprocess.Popen(...) .

Я не хочу использовать shell=True .

Спасибо!

Комментарии:

1. Как вы запускаете свой сценарий? Используете ли вы Python, установленный в вашей Ubuntu в WSL, или Python, установленный в основной системе Windows?

2. Можете ли вы проверить код возврата на платформе, на которой вы его обычно запускаете?

3. @DmitriOvodok , я запускаю записную книжку jupyter внутри кода Visual Studio, вызванного с помощью $ code . написано внутри терминала WSL1, установленного на ноутбуке Windows10. Затем я нажимаю команду выполнить все из записной книжки (в VSC). Там написано, что переводчик находится по адресу /bin/python3 . Я могу выбрать между этим и другим переводчиком, расположенным по адресу /usr/bin/python3 .

4. @DmitriOvodok, когда я запускаю simple .py внутри терминала WSL1, я пишу python3 script.py . Делая which python3 внутри терминала WSL1, я получаю в качестве вывода: /usr/bin/python3 . Итак, я предполагаю, что мне нужно выбрать этот путь интерпретатора внутри VSCode?

5. @velenos14 Ошибка может быть вызвана просто относительным путем. Вы можете использовать os.path.abspath , чтобы получить полные пути к файлу python и smilei файлу. Это исключило бы вероятность ошибки из-за неправильных путей.