Я хотел, чтобы инициировать процесс моего питона сценария (main.py)
, в частности, я хочу, чтобы запустить следующую командузапустить полностью независимый процесс
`nohup python ./myfile.py &`
и этот файл myfile.py
должны даже после моих главных выходов питона скрипт.
Кроме того, я хочу получить pid
нового процесса.
Я попытался os.spawnl*
, os.exec*
& subprocess.Popen
методы, все прекращают мой myfile.py
, если мой main.py сценарий завершается.
Возможно, у меня что-то не хватает.
Обновление: Могу ли я использовать os.startfile
с xdg-open
? Это правильный подход?
Пример
a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid
Если я проверяю ps aux | grep long_process
, я не мог видеть любой запущенный процесс.
long_process.py, который продолжает печатать текст: нет выхода.
Я делаю что-то не так здесь?
Можете ли вы опубликовать минимальный пример, который не работает? После тривиального подпроцесса импорта python -c; subprocess.Popen (["sleep", "60"]) '' вывод 'ps' показывает, что' sleep' продолжает работать нормально после выхода Python. – user4815162342
Вы используете Python с одним аргументом, «nohup/usr/bin/python25 ...» ', который не может работать, потому что исполняемый файл' python' будет искать скрипт в файле с именем «nohup/usr/bin»/... ', которого не существует. И поскольку вы указываете 'stderr' как' PIPE', даже не читая содержимое канала, вы никогда не увидите сообщение об ошибке. Потеряйте 'nohup' и' & 'и просто запустите' subprocess.Popen ([sys.executable, "/.../ long_process.py"]) '. Кроме того, не указывайте 'stdin' и' stderr' как трубы, если вы не имеете в виду это. – user4815162342
'nohup' имеет смысл, когда вы начинаете процесс из оболочки. Я не вижу 'shell = True' в вашем вызове« Popen ». – 9000