2013-01-09 25 views
7

Tôi đang cố gắng chạy một ứng dụng bên ngoài bằng Python với subprocess.call. Từ những gì tôi đã đọc nó subprocess.call không phải là nghĩa vụ phải chặn trừ khi bạn gọi Popen.wait, nhưng đối với tôi nó đang bị chặn cho đến khi ứng dụng bên ngoài thoát. Làm thế nào để sửa lỗi này?Python subprocess.call chặn

Trả lời

-1

Mã trong subprocess thực sự khá đơn giản và dễ đọc. Chỉ cần xem phiên bản 3.3 hoặc 2.7 (nếu thích hợp) và bạn có thể biết nó đang làm gì.

Ví dụ, call trông như thế này:

def call(*popenargs, timeout=None, **kwargs): 
    """Run command with arguments. Wait for command to complete or 
    timeout, then return the returncode attribute. 

    The arguments are the same as for the Popen constructor. Example: 

    retcode = call(["ls", "-l"]) 
    """ 
    with Popen(*popenargs, **kwargs) as p: 
     try: 
      return p.wait(timeout=timeout) 
     except: 
      p.kill() 
      p.wait() 
      raise 

Bạn có thể làm điều tương tự mà không gọi wait. Tạo một số Popen, đừng gọi số wait vào đó và đó chính là điều bạn muốn.

+20

Hữu ích, nhưng tăng dần. – dpitch40

5

Bạn đang đọc tài liệu sai. Theo họ:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

Chạy lệnh được mô tả bởi args. Chờ lệnh hoàn thành, sau đó trả về thuộc tính returncode.

+0

Ồ, được rồi. Làm thế nào để sao chép các chức năng của, nói, gọi os.spawnl với các tùy chọn P_NOWAIT? – dpitch40

+1

@ dpitch40 - http://docs.python.org/2/library/subprocess.html#replacing-the-os-spawn-family. –

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