OSError:[WinError 193]%1不是有效的Win32应用程序

Cax*_*ton 33 python subprocess python-3.4

我试图从python解释器中使用子进程调用python文件"hello.py".但我无法解决此错误.[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
Run Code Online (Sandbox Code Playgroud)

除了使用子进程之外,还有"使用参数调用python脚本"的替代方法吗?提前致谢.

Dav*_*nan 28

错误很清楚.该文件hello.py不是可执行文件.您需要指定可执行文件:

subprocess.call(['python.exe', 'hello.py', 'htmlfilename.htm'])
Run Code Online (Sandbox Code Playgroud)

您需要python.exe在搜索路径上可见,或者您可以将完整路径传递给运行调用脚本的可执行文件:

import sys
subprocess.call([sys.executable, 'hello.py', 'htmlfilename.htm'])
Run Code Online (Sandbox Code Playgroud)

  • "错误很明显." 今天我了解到"清晰"这个词的新含义. (143认同)
  • 特此错误消息.*不清楚,因为由于某种原因它不会将`%1`解析为`hello.py`.IMO这是Python中的一个错误. (13认同)
  • @ david-heffernan我不太了解核心Python /子进程模块的实现细节,说明`%1`占位符来自何处,以及为什么它没有解析为文件名.但正如你所说,即使bug在Windows API中,并且错误消息总是包含一个未解析的`%1`占位符,如果出现`OSError``subprocess.call`可以扫描错误消息'%1 `并在将消息提供给异常之前相应地替换它. (5认同)
  • 我们并不是抱怨 Python 没有自动填充 %1。我们抱怨说,当您后来说“并不总是清楚在 %1 中放入什么值”时,您声称“错误非常清楚”,而我们都认为“不清楚”的说法更现实。如果你省略了第一句话,或者说“%1 应该是 hello.py,但 Python 由于复杂的原因无法填写它”,那么这个评论线程就不会发生。 (4认同)
  • @david-heffernan 并不是说​​我认为这个讨论会引导到某个地方,但是不,我不一定需要知道 `%1` 到底来自哪里才能知道 Python 能够修复/改进它。当我说“Python”时,它包括子进程模块。 (2认同)

tde*_*ney 9

Python安装程序通常会在系统中注册.py文件.如果你明确地运行shell,它可以工作:

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

您可以在命令行上检查文件关联

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

C:\>ftype Python.File
Python.File="C:\Python27\python.exe" "%1" %*
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提醒我,当subprocess神秘地失败时,总是使用shell = True!这个问题与我的问题无关(我有一个实际的Windows可执行文件,由于某种原因它不会运行...无论使用32位还是64位版本的解释器都没有关系),但是您的建议是使用`shell = True`可以工作! (2认同)

Mon*_*lal 8

当我忘记shell=Truesubprocess.call.

subprocess.call('python modify_depth_images.py', shell=True)
Run Code Online (Sandbox Code Playgroud)

运行外部命令

要在不与其交互的情况下运行外部命令,例如使用os.system(),请使用该call()函数。

import subprocess

Simple command subprocess.call(['ls', '-1'], shell=True)
Run Code Online (Sandbox Code Playgroud)


Red*_*Boy 5

以上所有解决方案都是合乎逻辑的,我认为涵盖了根本原因,但对我来说,以上都没有奏效。因此把它放在这里可能对其他人有帮助。

我的environment被搞砸了。从回溯中可以看出,这里涉及到两个 python 环境:

  1. C:\Users\example\AppData\Roaming\Python\Python37
  2. C:\Users\example\Anaconda3

我清理了路径并从C:\Users\example\AppData\Roaming\Python\Python37.

然后它就像魅力一样工作。

我希望其他人可能会觉得这很有帮助。

链接帮助我找到了解决方案。