tôi muốn bắt đầu một quá trình từ kịch bản python của tôi (main.py)
, đặc biệt là tôi muốn chạy lệnh dưới đâyKhởi chạy một quá trình hoàn toàn độc lập
`nohup python ./myfile.py &`
và tập tin này myfile.py
nên ngay cả sau khi thoát python script chính của tôi.
Ngoài ra, tôi muốn nhận được pid
của quy trình mới.
tôi đã cố gắng os.spawnl*
, os.exec*
& subprocess.Popen
phương pháp, tất cả đều chấm dứt của tôi myfile.py
nếu kịch bản main.py tôi thoát.
Tôi có thể thiếu điều gì đó.
Cập nhật: Tôi có thể sử dụng os.startfile
với xdg-open
không? Đó có phải là một cách tiếp cận đúng không?
Ví dụ
a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid
Nếu tôi kiểm tra ps aux | grep long_process
, tôi không thể nhìn thấy bất kỳ quá trình chạy.
long_process.py tiếp tục in một số văn bản: không thoát.
Tôi có làm gì sai ở đây không?
Bạn có thể đăng một ví dụ tối thiểu không hoạt động được không? Sau một quy trình con nhập khẩu 'python -c 'tầm thường; subprocess.Popen (["sleep", "60"]) ''đầu ra của' ps' cho thấy rằng 'sleep' tiếp tục chạy tốt sau khi Python đã thoát. – user4815162342
Bạn đang chạy Python với một đối số duy nhất, '" nohup/usr/bin/python25 ... "', không thể hoạt động vì tệp thực thi 'python' sẽ tìm kiếm tập lệnh trong tệp có tên chính xác là' nohup/usr/bin/... ', không tồn tại. Và vì bạn chỉ định 'stderr' là' PIPE' mà không bao giờ đọc nội dung của đường ống, bạn sẽ không bao giờ thấy thông báo lỗi. Mất 'nohup' và' & ', và chỉ cần chạy' subprocess.Popen ([sys.executable, "/.../ long_process.py"]) '. Ngoài ra, không chỉ định 'stdin' và' stderr' làm đường ống trừ khi bạn muốn nói. – user4815162342
'nohup' có ý nghĩa nhất khi bạn bắt đầu quá trình từ trình bao. Tôi không thấy 'shell = True' trong cuộc gọi' Popen' của bạn. – 9000