2014-09-03 15 views
12

Tôi đang cố gắng gọi một tệp python "hello.py" từ bên trong trình thông dịch python với tiến trình con. Nhưng tôi không thể giải quyết lỗi này. [Python 3.4.1].OSError: [WinError 193]% 1 không phải là ứng dụng Win32 hợp lệ

import subprocess  
subprocess.call(['hello.py', 'htmlfilename.htm']) 
Traceback (most recent call last): 
    File "<pyshell#42>", line 1, in <module> 
    subprocess.call(['hello.py', 'htmlfilename.htm']) 
    File "C:\Python34\lib\subprocess.py", line 537, in call 
    with Popen(*popenargs, **kwargs) as p: 
    File "C:\Python34\lib\subprocess.py", line 858, in __init__ 
    restore_signals, start_new_session) 
    File "C:\Python34\lib\subprocess.py", line 1111, in _execute_child 
    startupinfo) 
OSError: [WinError 193] %1 is not a valid Win32 application 

Ngoài ra, có cách nào khác để "gọi kịch bản python với đối số" ngoài việc sử dụng tiến trình con không? Cảm ơn trước.

Trả lời

15

Lỗi này khá rõ ràng. Tệp hello.py không phải là tệp thi hành. Bạn cần phải xác định thực thi:

subprocess.call(['python.exe', 'hello.py', 'htmlfilename.htm']) 

Bạn sẽ cần python.exe để được nhìn thấy trên con đường tìm kiếm, hoặc bạn có thể vượt qua đường dẫn đầy đủ đến tập tin thực thi đang chạy kịch bản gọi:

import sys 
subprocess.call([sys.executable, 'hello.py', 'htmlfilename.htm']) 
+61

"Lỗi này khá rõ ràng". Hôm nay tôi đã học được có một ý nghĩa mới cho từ "rõ ràng". –

+3

Thông báo lỗi là đặc biệt. * không * rõ ràng vì nó không giải quyết '% 1' thành' hello.py' vì một lý do nào đó. IMO là một lỗi trong Python. – sschuberth

+0

@sschuberth Python sẽ làm như thế nào? Nó không phải là Python gặp phải lỗi. Đó là module 'subprocess'. Nó sẽ phải kiểm tra mã lỗi và chỉ cung cấp một chuỗi thay thế cho lỗi cụ thể này. Tôi biết rất ít chương trình làm điều đó. –

6

Trình cài đặt Python thường đăng ký các tệp .py với hệ thống. Nếu bạn chạy các vỏ một cách rõ ràng, nó hoạt động:

import subprocess 
subprocess.call(['hello.py', 'htmlfilename.htm'], shell=True) 
# --- or ---- 
subprocess.call('hello.py htmlfilename.htm', shell=True) 

Bạn có thể kiểm tra các hiệp hội tập tin của bạn trên dòng lệnh với

C:\>assoc .py 
.py=Python.File 

C:\>ftype Python.File 
Python.File="C:\Python27\python.exe" "%1" %* 
+1

Cảm ơn bạn đã nhắc tôi rằng 'shell = True' luôn là một tùy chọn khi' subprocess' thất bại một cách bí ẩn! Câu hỏi này không liên quan đến vấn đề của tôi (tôi có một tệp thực thi Windows, nó sẽ không chạy vì một lý do nào đó ... không quan trọng nếu tôi sử dụng phiên bản 32 bit hoặc 64 bit của trình thông dịch), nhưng đề xuất của bạn về sử dụng 'shell = True' hoạt động! – ArtOfWarfare

0

Tôi đã cùng một lỗi trong khi tôi quên sử dụng shell=True trong subprocess.call.

subprocess.call('python modify_depth_images.py', shell=True) 

Running External Command

To run an external command without interacting with it, such as one would do with os.system(), Use the call() function.

import subprocess

Simple command subprocess.call(['ls', '-1'], shell=True)

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