OSError: [WinError 193] %1 不是有效的 Win32 应用程序
我想在Python解释器里面用subprocess来调用一个叫“hello.py”的Python文件。但是我遇到了一个错误,解决不了。[Python 3.4.1]
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脚本”,而不是使用subprocess?
14 个回答
对我来说,问题解决的步骤如下:
- 在Windows上安装32位的Python版本。
- 把新安装的Python和它的脚本文件夹(也就是pip所在的地方)添加到环境变量中。
问题出现的原因是,当你想运行的某个应用需要32位的Python版本,而你却安装了64位的版本。
注意:安装完32位的Python后,别忘了用这个新安装的32位Python的pip来安装所有需要的包。
以上的解决方案都很有道理,我觉得它们都抓住了问题的根本原因,但对我来说,以上的方法都没有用。所以我把我的经历分享出来,希望能对其他人有帮助。
我的
环境
出现了问题。从错误信息中可以看到,这里涉及到两个 Python 环境:
C:\Users\example\AppData\Roaming\Python\Python37
C:\Users\example\Anaconda3
我清理了一下路径,直接把 C:\Users\example\AppData\Roaming\Python\Python37
里的所有文件都删掉了。
然后一切就正常了。
这个 链接 帮助我找到了这个解决办法。
我遇到了同样的错误,因为我在使用 subprocess.call
时忘记加 shell=True
。
subprocess.call('python modify_depth_images.py', shell=True)
如果你想运行一个外部命令,但不想和它互动,就像用
os.system()
一样,可以使用call()
函数。import subprocess #Simple command subprocess.call(['ls', '-1'], shell=True)
把 shell 参数设置为真值会让 subprocess 启动一个中间的 shell 进程,然后让它去执行这个命令。默认情况下,它是直接运行命令的。
import subprocess # Command with shell expansion subprocess.call('echo $HOME', shell=True)
Python的安装程序通常会把.py文件和系统进行关联,也就是说,系统会知道.py文件是用Python来运行的。如果你直接在命令行中运行Python的命令,它就能正常工作:
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" %*
这个错误很明显。文件 hello.py
不是一个可执行文件。你需要指定一个可执行的文件:
subprocess.call(['python.exe', 'hello.py', 'htmlfilename.htm'])
你需要确保 python.exe
在搜索路径中可见,或者你可以直接提供运行这个脚本的可执行文件的完整路径:
import sys
subprocess.call([sys.executable, 'hello.py', 'htmlfilename.htm'])