我正在尝试查找有关使用 Python
subprocess.Popen
库启动 Windows 进程的“副作用”的信息。
我听说从Python启动Windows命令有一些好的/坏的做法,一家大软件公司指责我的软件导致了他的崩溃,所以我想知道是否真的有任何副作用。
这是一个片段来解释我的自我:
def execute_command(command, env=None):
res = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env,
creationflags=subprocess.CREATE_NO_WINDOW)
start = time()
output, error = res.communicate()
execution_time = time() - start
if output:
output = output.decode(_SYSTEM_ENCODING, errors='replace')
else:
output = ""
if error:
error = error.decode(_SYSTEM_ENCODING, errors='replace')
else:
error = ""
return res.returncode, output, error, execution_time
def start_software():
# do some stuff
execute_command('"C:\Program Files\Software\Software.exe" --foo --faa ')
# do some other stuff
# This to avoid blocking my
# pyQt5 graphical interface, because the windows command
# may be running by days or hours
th=Threading.thread(target=start_software)
th.start()
据我所知,该命令的启动方式与用户在cmd中键入命令的方式相同,它是在单独的进程中启动的,并且不与主进程共享相同的内存。
我的代码片段包含在Python 3.7 Qt5软件中,用pyinstaller编译,他们说由于我的图形界面包含HTML,所以正在使用Windows库MsHTML,这导致第二个软件崩溃......
这是相当推测性的,但希望至少对指导你的努力有一定的帮助。
进程隔离如果正确实施,应该可以防止任何两个进程相互干扰。事实上,我预测你的问题出在其他地方,即使是在 Windows 这个摇摇欲坠的平台上。
您的问题更可能出现在某些操作系统资源的使用冲突上。添加线程可能会导致这种情况。如果程序的 GUI 部分在底层使用了非线程安全的东西,并且竞争程序正在做同样的事情,结果可能是崩溃,或更糟。 不幸的是,在这个详细程度,除了疯狂的猜测之外,我们无法提供更多信息,因为我们无法访问竞争程序,或者程序中与实际崩溃的组件交互的部分。