Python 在没有控制台的情况下运行.exe-OSError:[WinError 6]句柄无效

Python 在没有控制台的情况下运行.exe-OSError:[WinError 6]句柄无效,python,python-3.x,subprocess,pyinstaller,Python,Python 3.x,Subprocess,Pyinstaller,编辑:请注意,我已经看到了与此问题相关的其他主题,并且已经尝试了其中的大部分建议 我使用pyinstaller运行一个.exe文件,现在我尝试在没有控制台的情况下运行它(使用-w命令)。 我的一个密钥库patool使用子进程,这会导致以下错误: Traceback (most recent call last): File "apscheduler\executors\base.py", line 125, in run_job File "script.p

编辑:请注意,我已经看到了与此问题相关的其他主题,并且已经尝试了其中的大部分建议

我使用pyinstaller运行一个.exe文件,现在我尝试在没有控制台的情况下运行它(使用-w命令)。 我的一个密钥库patool使用子进程,这会导致以下错误:

Traceback (most recent call last):
  File "apscheduler\executors\base.py", line 125, in run_job
  File "script.py", line 478, in Archiver
  File "patoolib\__init__.py", line 521, in _create_archive
  File "patoolib\__init__.py", line 421, in run_archive_cmdlist
  File "patoolib\util.py", line 227, in run_checked
  File "patoolib\util.py", line 219, in run
  File "subprocess.py", line 339, in call
  File "subprocess.py", line 753, in __init__
  File "subprocess.py", line 1090, in _get_handles
OSError: [WinError 6] The handle is invalid
以下是patool util.py代码的一部分,其中包含给出错误的subprocesss.call()

def run (cmd, verbosity=0, **kwargs):
    """Run command without error checking.
    @return: command return code"""
    # Note that shell_quote_nt() result is not suitable for copy-paste
    # (especially on Unix systems), but it looks nicer than shell_quote().
    if verbosity >= 0:
        log_info("running %s" % " ".join(map(shell_quote_nt, cmd)))
    if kwargs:
        if verbosity >= 0:
            log_info("    with %s" % ", ".join("%s=%s" % (k, shell_quote(str(v)))\
                                           for k, v in kwargs.items()))
        if kwargs.get("shell"):
            # for shell calls the command must be a string
            cmd = " ".join(cmd)
    if verbosity < 1:
        # hide command output on stdout
        with open(os.devnull, 'wb') as devnull:
            kwargs['stdout'] = devnull
            res = subprocess.call(cmd, **kwargs)       <------------- ERROR 
    else:
        res = subprocess.call(cmd, **kwargs)
    return res
def运行(cmd,详细度=0,**kwargs):
“”“在不检查错误的情况下运行命令。”。
@返回:命令返回代码“”
#请注意,shell_quote_nt()结果不适用于复制粘贴
#(特别是在Unix系统上),但它看起来比shell()更好。
如果详细程度>=0:
日志信息(“正在运行%s”%”。加入(映射(shell,cmd)))
如果是kwargs:
如果详细程度>=0:
日志信息(“带有%s”%,”。加入(“%s=%s”%(k,shell引号(str(v)))\
对于k,v在kwargs.items()中)
如果kwargs.get(“shell”):
#对于shell调用,命令必须是字符串
cmd=”“.join(cmd)
如果详细程度<1:
#在标准输出上隐藏命令输出
将open(os.devnull,'wb')作为devnull:
kwargs['stdout']=devnull

res=subprocess.call(cmd,**kwargs)您是否尝试过使用
kwargs['stdout']=subprocess.DEVNULL
?(不是很乐观;文档暗示它只是
os.devnull
的别名)链接的问题涉及
stdin
,而您正在操作
stdout
。尝试将两者连接到
os.devnull
。如果这解决了它,这基本上是一个重复的感谢你的及时答复!你为什么说我在操纵stdout?我发布的代码只是源于patool util.py的原始代码——stdout操作就在原始代码中。就在下面,我说我还将
kwargs['stdin']=devnull
添加到这个原始代码中。我还尝试将
stdin=subprocess.DEVNULL
添加到call()方法中作为参数,尽管这应该与执行kwargs['stdin']=DEVNULL相同。我尝试实现了
kwargs['stdout']=subprocess.DEVNULL
kwargs['stdin']=subprocess.DEVNULL
-没有更改:(您尝试过
kwargs吗['stdout']=subprocess.DEVNULL
?(不是很乐观;文档暗示它只是
os.DEVNULL
的别名)链接的问题谈论的是
stdin
,而您正在操作
stdout
。尝试将这两个都连接到
os.devnull
。如果解决了这个问题,这基本上是重复的,感谢您的及时回复!为什么您说我在操作stdout?我发布的代码只是源代码,因为它来自patool util.py-stdout操作在原始代码中。就在下面,我说我还将
kwargs['stdin']=devnull
添加到此原始代码中。我还尝试将
stdin=subprocess.devnull
作为call()方法的参数添加,尽管它应该与执行kwargs['stdin']相同=devnull。我尝试实现
kwargs['stdout']=subprocess.devnull
kwargs['stdin']=subprocess.devnull
-没有更改:(