Python: подпроцесс с различным рабочим каталогом
У меня есть python script, который находится в этом каталоге:
work/project/test/a.py
Внутри a.py
я использую subprocess.POPEN
для запуска процесса из другого каталога,
work/to_launch/file1.pl, file2.py, file3.py, ...
Код Python:
subprocess.POPEN("usr/bin/perl ../to_launch/file1.pl")
и в разделе work/project/, я набираю следующий
[[email protected] project]python test/a.py,
error "file2.py," Нет такого файла или каталога "
Как добавить work/to_launch/
, чтобы можно было найти эти зависимые файлы file2.py
?
Ответы
Ответ 1
Ваш код не работает, потому что относительный путь рассматривается относительно вашего текущего местоположения (на один уровень выше test/a.py
).
В sys.path[0]
у вас есть путь к текущему запуску script.
Используйте os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch)
с relPathToLaunch = '../to_launch/file1.pl'
, чтобы получить абсолютный путь к вашему file1.pl
и запустите с ним perl
.
EDIT: если вы хотите запустить file1.pl из своего каталога, а затем вернуться назад, просто запомните свой текущий рабочий каталог и затем вернитесь:
origWD = os.getcwd() # remember our original working directory
os.chdir(os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch))
subprocess.POPEN("usr/bin/perl ./file1.pl")
[...]
os.chdir(origWD) # get back to our original working directory
Ответ 2
Используйте пути относительно script, а не текущий рабочий каталог
os.path.join(os.path.dirname(__file__), '../../to_launch/file1.pl)
См. также мой ответ на Python: получить путь к файлу в каталоге сестра?
Ответ 3
Вы можете использовать этот код для установки текущего каталога:
import os
os.chdir("/path/to/your/files")