Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.execl错误参数拆分_Python_Windows_Subprocess_Python 3.6 - Fatal编程技术网

Python os.execl错误参数拆分

Python os.execl错误参数拆分,python,windows,subprocess,python-3.6,Python,Windows,Subprocess,Python 3.6,例如,使用python程序自己的解释器、参数和替换过程重新启动python程序的一段代码(稍有中断)就是使用一个os.exec函数 这些函数都执行一个新程序,替换当前进程;他们不会回来。在Unix上,新的可执行文件被加载到当前进程中,并且将具有与调用方相同的进程id。错误将报告为操作错误异常 所以我做了这件事: import os,sys def restart_program(): """Restarts the current program, with file objects

例如,使用python程序自己的解释器、参数和替换过程重新启动python程序的一段代码(稍有中断)就是使用一个
os.exec
函数

这些函数都执行一个新程序,替换当前进程;他们不会回来。在Unix上,新的可执行文件被加载到当前进程中,并且将具有与调用方相同的进程id。错误将报告为操作错误异常

所以我做了这件事:

import os,sys

def restart_program():
    """Restarts the current program, with file objects and descriptors
       cleanup
    """
    print("restarting")
    python = sys.executable
    os.execl(python, python, *sys.argv)

restart_program()
我得到:

C:\Program: can't open file 'Files\Python36\python.exe': [Errno 2] No such file or directory
很明显,这是一个“带空格的该死的路径”的例子。但这不应该发生,因为我自己没有编写命令行,而是干净地传递了参数

为了让它工作,由于
arg0
通常被忽略,我会这样做(例如):

现在程序运行了


所以bug或windows版本的“功能”?

不要在windows中使用
os.execl
。Windows API中没有
exec
函数系列。这实际上是由C运行时实现的,它使用空格连接参数,而不尝试在命令行中引用它们。然后它调用
CreateProcess
来创建新进程,并简单地退出当前进程。由于python.exe是一个控制台应用程序,如果连接到同一控制台的父进程正在等待python.exe退出,则会造成混乱的情况。您将有两个进程同时访问控制台。@eryksun:听起来似乎有道理,但您有参考吗?quick还没有找到任何东西。CRT的
exec
函数是,源代码是用Visual Studio分发的。@eryksun:是的,就是这样:“字符串中嵌入的空格可能会导致意外行为;例如,在那里传递
\u exec
字符串
”“
将导致新进程获得两个参数,
“hi”
“there”
。我的execl特定搜索没有找到这一点。Windows中的典型模式是使用新控制台重新启动(即传递给
subprocess.Popen的
创建新控制台
创建标志),或要尽可能关闭当前进程,请重新启动一个新进程,然后等待它退出。
C:\Program: can't open file 'Files\Python36\python.exe': [Errno 2] No such file or directory
os.execl(python, "python.exe", *sys.argv)