2014-09-03 329 views
12

我想從子進程的python解釋器中調用python文件「hello.py」。但我無法解決這個錯誤。 [Python 3.4.1]。OSError:[WinError 193]%1不是有效的Win32應用程序

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 

也有任何替代方法「使用參數調用python腳本」,而不是使用子進程? 在此先感謝。

回答

15

錯誤很明顯。文件hello.py不是可執行文件。您需要指定可執行文件:

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

你需要python.exe是搜索路徑上可見,或者你會傳遞的完整路徑是運行腳本調用可執行文件:

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

「的錯誤是很清楚。」今天我學到了「清晰」這個詞的新含義。 – 2015-08-08 14:33:55

+3

錯誤消息是esp。 *不清楚,因爲由於某種原因它沒有將'%1'解析爲'hello.py'。 IMO是Python中的一個bug。 – sschuberth 2016-01-07 13:03:00

+0

@sschuberth Python如何做到這一點?遇到錯誤不是Python。這是'subprocess'模塊。它將不得不檢查錯誤代碼並僅爲此特定錯誤提供替換字符串。我知道很少有這樣的程序。 – 2016-01-07 13:12:39

6

Python安裝程序通常會向系統註冊.py文件。如果你明確地運行shell,它的工作原理:

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

您可以

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

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

感謝您提醒我,'shell = True'永遠是'subprocess'神祕失敗的選項!這個問題與我的問題無關(我有一個實際的Windows可執行文件,由於某種原因,它不會運行......如果我使用32位或64位版本的解釋器,則無關緊要),但是您的建議是使用'shell = True'的作品! – ArtOfWarfare 2017-01-16 16:18:00

0

我得到了同樣的錯誤,我忘了在subprocess.call使用shell=True檢查命令行上的文件關聯。

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)

相關問題