2017-01-24 19 views
5

Tôi đang mở một chương trình sử dụng subprocess.PopenMàn trình phụ được tạo ra từ một lệnh shell trong cửa sổ

import subprocess

prog = subprocess.Popen(['myprog', args], shell=True)

Tôi muốn theo dõi quá trình 'myprog' và chờ cho đến khi nó kết thúc trước khi tôi mã tiếp tục.

Vấn đề mà tôi đang gặp phải là prog.pid là PID của trình bao chứ không phải 'myprog' và tôi không biết cách lấy PID của 'myprog'. Tôi cố gắng để sử dụng psutil để tìm các quá trình con của prog.pid:

parent = psutil.Process(prog.pid)
children = parent.children(recursive=True)

nhưng một danh sách trống được trả về.

Rất tiếc, tôi không thể khởi động 'myprog' mà không có trình bao. Khi tôi chạy lệnh với shell=False Tôi nhận được thông báo lỗi sau: FileNotFoundError: [WinError 2] The system cannot find the file specified

Tôi có tìm kiếm trên web dẫn cao và thấp nhưng tất cả hứa hẹn là dành cho người dùng không có Windows.

+0

bạn có chắc bạn không thể làm cho chương trình của bạn mà không có vỏ? Bạn có thể giải thích tại sao trong câu hỏi của bạn? có thể với dòng lệnh thực tế. Bởi vì đó là fixable. –

+0

Tôi đang cố mở Atom bằng lệnh 'đường dẫn nguyên tử \ tới \ file \ để \ mở' – EDWhyte

+0

và bạn có thể gõ' ở đâu nguyên tử' không?chúng ta sẽ đi đâu đó ở đây. –

Trả lời

1

lệnh atom của bạn có lẽ là một tập tin .cmd mà ra mắt một thực thi, điều này giải thích sự cần thiết của shell=True

Bạn sẽ không đi đến mở rộng tái mã hóa các tập tin .bat trong python, NHƯNG bạn don' t cần PID thực thi.

Nếu tệp thực thi kết thúc, tệp lô sẽ kết thúc, vì vậy hãy quên theo dõi prog.pid, chỉ cần theo dõi prog sử dụng poll (trong cùng một tập lệnh python).

Phương thức poll cho phép kiểm tra xem quá trình đã kết thúc chưa (nếu nó có, nó trả về mã thoát, nếu nó không trả về None) và điều này không bị chặn để bạn có thể làm điều đó bất cứ lúc nào bạn muốn :

if prog.poll() is not None: 
    # process has ended 
    print("ended") 

Hãy nhắc nhở chờ đợi chặn làm điều đó:

return_code = prog.wait() 

Nhưng trong trường hợp của bạn, lệnh atom.cmd dường như bắt đầu quá trình ở chế độ nền, làm cho nó không thể theo dõi mà không PID.

Cách giải quyết trong trường hợp đó là tạo bản sao atom.cmd, loại bỏ tiền tố start để chạy tệp thực thi ở nền trước và chạy bản sao thay thế.

(hoặc kể từ khi cmd cuộc gọi khác atom.cmd tập tin như bạn nhận xét, xác định vị trí các tập tin app-1.13.0\resources\cli\atom.cmd từ atom.cmd thư mục gốc và loại bỏ các tiền tố start có)

+0

Tôi đã thử sử dụng 'prog.poll' và' prog.wait() 'nhưng nó chấm dứt khá nhanh chóng mà thúc đẩy tôi tin rằng tôi đang giám sát vỏ thay vì 'myprog' – EDWhyte

+0

xem chỉnh sửa của tôi. Tôi nghĩ rằng có một cách giải quyết. –

+0

Tôi đã mở tệp atom.cmd trong trình chỉnh sửa văn bản và đây là nội dung: dòng 1' @ echo off' dòng 2' "% ~ dp0 \ .. \ app-1.13.0 \ resources \ cli \ atom.cmd "% *'. Tôi không thấy tiền tố bắt đầu – EDWhyte

Các vấn đề liên quan