我试图找到有关使用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 Qt 5软件中,用pyinstaller编译,他们说,由于我的图形界面包括HTML,正在使用Windows库MsHTML,并导致第二个软件崩溃。
1条答案
按热度按时间lmyy7pcs1#
这是相当投机的,但希望至少对指导您的工作有一定的帮助。
Process isolation如果正确实现的话,应该可以防止任何两个进程相互干扰。事实上,我预测你的问题出在其他地方,即使是在Windows这个摇摇欲坠的平台上。
你的问题更有可能在于某些操作系统资源的冲突使用。线程的添加可能会导致这种情况。如果程序的GUI部分在后台使用了一些不是线程安全的东西,而竞争程序正在做同样的事情,结果可能是崩溃,或者更糟。
不幸的是,在这个细节水平上,不可能提供比疯狂的猜测更多的东西,因为我们无法访问竞争程序,或者你的程序中与实际崩溃的组件交互的部分。