Python &引用;子流程调用";不';不行。错误消息:";[WinError 193]%1不是有效的Win32应用程序;

Python &引用;子流程调用";不';不行。错误消息:";[WinError 193]%1不是有效的Win32应用程序;,python,subprocess,Python,Subprocess,我的脚本必须打开不同类型的脚本(.exe、.py、.c等),为了实现这一目标,我使用以下两种说明: os.chdir(文件夹路径) os.system(“开始”+脚本名称) 代码可以工作,但只要使用os.system(“开始”+SCRIPT\u NAME),它就会显示控制台窗口。为了隐藏它,我在互联网上读到我必须使用子流程模块。我尝试使用这些命令,但它们不起作用: C:\test λ ls -l total 16 -rw-r--r-- 1 Admin 197121 13721 Oct 19 00

我的脚本必须打开不同类型的脚本(.exe、.py、.c等),为了实现这一目标,我使用以下两种说明:

  • os.chdir(文件夹路径)
  • os.system(“开始”+脚本名称)
  • 代码可以工作,但只要使用
    os.system(“开始”+SCRIPT\u NAME)
    ,它就会显示控制台窗口。为了隐藏它,我在互联网上读到我必须使用
    子流程
    模块。我尝试使用这些命令,但它们不起作用:

    C:\test
    λ ls -l
    total 16
    -rw-r--r-- 1 Admin 197121 13721 Oct 19 00:44 test.py
    
    C:\test
    λ python
    Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> import subprocess
    >>> from subprocess import CREATE_NO_WINDOW
    >>>
    >>> subprocess.call("test.py", creationflags=CREATE_NO_WINDOW)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 340, in call
        with Popen(*popenargs, **kwargs) as p:
      File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 854, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 1307, in _execute_child
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
    OSError: [WinError 193] %1 is not a valid Win32 application
    >>>
    
    C:\test
    λls-l
    总数16
    -rw-r--r--1管理员197121 13721 10月19日00:44 test.py
    C:\测试
    λpython
    win32上的Python 3.8.3(tags/v3.8.3:6f8c832,2020年5月13日,22:20:19)[MSC v.1925 32位(英特尔)]
    有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
    >>>
    >>>导入子流程
    >>>从子流程导入创建\u否\u窗口
    >>>
    >>>subprocess.call(“test.py”,creationflags=CREATE\u NO\u窗口)
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    调用中的第340行文件“C:\Users\Admin\AppData\Local\Programs\Python 38-32\lib\subprocess.py”
    将Popen(*popenargs,**kwargs)作为p:
    文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\subprocess.py”,第854行,在uu init中__
    self.\u execute\u child(参数、可执行文件、预执行文件、关闭文件、,
    文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\subprocess.py”,第1307行,在执行子进程中
    hp、ht、pid、tid=\u winapi.CreateProcess(可执行文件、参数、,
    OSError:[WinError 193]%1不是有效的Win32应用程序
    >>>
    
    如何解决这个问题?

    您可以使用
    call()
    ,但是
    run()
    应该是一个更新的版本,而且更健壮。只要它达到了您的目标,就可以使用您喜欢的口味

    #! /usr/bin/env python3
    import subprocess as sp
    
    cmd = ['echo', 'hi']  ##  separate args in list.  safer this way
    response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
    print( response.stderr,  response.stdout )
    
    
    cmd = 'echo hi'  ##  alternate string method
    response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, shell=True, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
    print( response.stderr,  response.stdout )
    
    如果不指定编码,则返回b‘二进制编码字符串’

    您可以使用
    call()
    ,但是
    run()
    应该是一个更新的版本,并且更健壮。只要它达到您的目标,就可以使用您喜欢的任何风格

    #! /usr/bin/env python3
    import subprocess as sp
    
    cmd = ['echo', 'hi']  ##  separate args in list.  safer this way
    response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
    print( response.stderr,  response.stdout )
    
    
    cmd = 'echo hi'  ##  alternate string method
    response = sp .run( cmd, stdout=sp.PIPE, stderr=sp.PIPE, shell=True, encoding='utf-8', creationflags=sp.CREATE_NO_WINDOW)
    print( response.stderr,  response.stdout )
    

    如果您不指定编码,那么它将返回b‘二进制编码字符串’

    您可以尝试:
    子流程调用([“python3”、“test.py”],creationflags=CREATE\u NO\u WINDOW)
    ?它将返回数字
    9009
    ,但不返回其他任何内容。。请参阅为什么
    %1
    是消息的一部分。您可以尝试:
    子流程调用([“python3”、“test.py”],creationflags=CREATE_NO_WINDOW)
    ?它会返回编号
    9009
    ,但不会返回任何其他内容。请参阅以了解
    %1
    为什么是消息的一部分。