Python os.execl错误参数拆分
例如,使用python程序自己的解释器、参数和替换过程重新启动python程序的一段代码(稍有中断)就是使用一个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
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)