2009-11-30 76 views
14

Tôi đã cố gắng gọi một quy trình qua Python với một vài đối số. Thực thi các tập tin batch chính nó hoạt động tốt cho tôi, nhưng dịch nó vào Python làm cho tôi hét lên. Dưới đây là nội dung của tệp lô:Thực thi một quy trình con không thành công

"C:\Program Files\bin\cspybat" "C:\Program Files\bin\armproc.dll" "C:\Program Files\bin\armjlink.dll" "C:\Documents and Settings\USER\Desktop\CAL\testing\Verification\FRT\Code\TC1\Output\Genericb\Debug\Exe\Gen.out" --download_only --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf" "--drv_verify_download" "--semihosting" "--device=STM32F10xxB" "-d" "jlink" "--drv_communication=USB0" "--jlink_speed=auto" "--jlink_initial_speed=32" "--jlink_reset_strategy=0,0" 

Tệp thi hành được chạy theo tập tin thực thi có tên cspybat. Đầu ra của tệp thực thi cung cấp thông tin: All parameters after --backend are passed to the back end.

Cũng lưu ý rằng một số tham số là chuỗi và một số không.

Giải pháp

đó làm việc cho tôi ngay bây giờ:

""" MCU flashing function""" 
params = [r"C:\Program Files\bin\cspy", 
      r"C:\Program Files\bin\arpro.dll", 
      r"C:\Program Files\bin\arjink.dll", 
      r"C:\Documents and Settings\USER\Desktop\Exe\GenerV530b.out", 
      "--download_only", "--backend", "-B", "--endian=little", "--cpu=Cort3", "--fpu=None", "-p", 
      r"C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf", 
      "--drv_verify_download", "--semihosting", "--device=STM32F10xxB", "-d", "jlink", "--drv_communication=USB0", 
      "--jlink_speed=auto", "--jlink_initial_speed=32", "--jlink_reset_strategy=0,0" ] 
print(subprocess.list2cmdline(params)) 
p = subprocess.Popen(subprocess.list2cmdline(params)) 
+0

Bạn có thể gửi một số mã thực tế mà bạn sử dụng? –

+0

xem bên dưới ....... – binaryguy

+1

@ wanderameise: Không đăng thông tin làm rõ câu hỏi là "câu trả lời". Nó KHÔNG phải là câu trả lời. Đó là thông tin quan trọng phải là một phần của câu hỏi để chúng tôi có thể trợ giúp. Vui lòng XÓA câu trả lời của bạn và CẬP NHẬT câu hỏi của bạn với thông tin bổ sung. –

Trả lời

22

Để thực hiện một tập tin thực thi trong Windows:

from subprocess import Popen 
p = Popen("batchfile.bat", cwd=r"c:\directory\containing\batchfile") 
stdout, stderr = p.communicate() 

Nếu bạn không muốn thực hiện các tập tin thực thi , nhưng thay vì thực hiện lệnh trong câu hỏi của bạn trực tiếp từ Python, bạn cần phải thử nghiệm một chút với đối số đầu tiên là Popen.

Trước hết, đối số đầu tiên có thể là chuỗi hoặc chuỗi.

Vì vậy, bạn có ghi:

p = Popen(r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run" "C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll" ... ...', cwd=r"...") 

hoặc

p = Popen([r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run", r"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll", ...], cwd=r"...") 
# ... notice how you don't need to quote the elements containing spaces 

Theo tài liệu:

On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline() method. Please note that not all MS Windows applications interpret the command line the same way: list2cmdline() is designed for applications using the same rules as the MS C runtime.

Vì vậy, nếu bạn sử dụng một chuỗi, nó sẽ được chuyển đổi sang một chuỗi . Tôi có lẽ sẽ cố gắng với một chuỗi đầu tiên, kể từ đó bạn sẽ không phải trích dẫn tất cả các yếu tố có chứa không gian (list2cmdline() hiện điều đó cho bạn).

Để khắc phục sự cố, tôi khuyên bạn nên chuyển chuỗi của mình tới subprocess.list2cmdline() và kiểm tra kết quả.

Edit:

Đây là những gì tôi muốn làm gì nếu tôi là bạn:

a) Tạo một kịch bản đơn giản Python (testparams.py) như thế này:

import subprocess 
params = [r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run.exe", ...] 
print subprocess.list2cmdline(params) 

b) Chạy tập lệnh từ dòng lệnh (python testparams.py), sao chép và dán đầu ra vào một dòng lệnh khác, nhấn enter và xem điều gì xảy ra.

c) Nếu nó không hoạt động, hãy chỉnh sửa tệp python và lặp lại cho đến khi nó hoạt động.

+0

liên quan đến đề xuất thứ hai của bạn: [Lỗi 193]% 1 không phải là ứng dụng Win32 hợp lệ – binaryguy

+0

Cập nhật câu hỏi của bạn bằng đoạn mã sao chép lỗi. – codeape

+0

CNTT HOẠT ĐỘNG !!! TUYỆT DIỆU!! cảm ơn anh chàng! – binaryguy

0

Trước tiên, bạn không cần cần tất cả các trích dẫn đó. Vì vậy, loại bỏ chúng. Bạn chỉ cần dấu ngoặc kép xung quanh các tham số có tên tệp khi tên tệp đó có dấu cách (thật ngu ngốc, Windows thực hiện việc này thường xuyên).

Thông số của bạn chỉ đơn giản là một danh sách các chuỗi, một số trong đó cần báo giá. Bởi vì Windows sử dụng không chuẩn \ cho dấu phân cách đường dẫn, hãy sử dụng chuỗi "thô" cho các tên này.

params = [ 
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll"', 
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\ajl.dll"', 
    r'"C:\Documents and Settings\USER\Desktop\abc.out"', 
    "--backend", 
    "-B", 
    "--endian=little", 
    "--cpu=Cortex", 
    "--fpu=None", 
    "-p", 
    r'"C:\Program Files\unknown\abc.ddf"', 
    "--drv_verify_download", 
    "--semihosting", 
    "--device=STM32F10xxB", 
    "-d", 
    "jjftk", 
    "--drv_communication=USB0", 
    "--speed=auto", 
    "--initial_speed=32", 
    "--reset_strategy=0,0"] 

Sử dụng một cái gì đó giống như

program = r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run"' 
subprocess.Popen([program]+params) 
+0

WindowsError: [Lỗi 3] Hệ thống không thể tìm thấy đường dẫn được chỉ định – binaryguy

+0

Cái nào? Vui lòng cung cấp chi tiết bằng cách cập nhật câu hỏi của bạn. –

+1

@ S.Lott: Tôi tin bạn không nên trích dẫn các tham số chứa khoảng trắng (trong trường hợp này params [0], [1], [2] và [9]. Subprocess.list2cmdline sẽ trích dẫn các tham số khi cần thiết khi tạo chuỗi được truyền cho CreateProcess – codeape

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