使用subprocess.Popen启动子进程对主进程有影响吗?

问题描述 投票:0回答:2

我正在尝试查找有关使用 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,这导致第二个软件崩溃......

python python-3.x multithreading pyqt5 subprocess
2个回答
0
投票

这是相当推测性的,但希望至少对指导你的努力有一定的帮助。

进程隔离如果正确实施,应该可以防止任何两个进程相互干扰。事实上,我预测你的问题出在其他地方,即使是在 Windows 这个摇摇欲坠的平台上。

您的问题更可能出现在某些操作系统资源的使用冲突上。添加线程可能会导致这种情况。如果程序的 GUI 部分在底层使用了非线程安全的东西,并且竞争程序正在做同样的事情,结果可能是崩溃,或更糟。 不幸的是,在这个详细程度,除了疯狂的猜测之外,我们无法提供更多信息,因为我们无法访问竞争程序,或者程序中与实际崩溃的组件交互的部分。


0
投票
subprocess.Popen

调用进程时,子进程将重新使用父进程已加载的 DLL。

这可能是个问题,也可能不是问题,具体取决于您打包代码的方式。目前,这导致我遇到与以下问题完全相同的问题:

停止Python Popen进程继承DLL

© www.soinside.com 2019 - 2024. All rights reserved.