Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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多处理无法控制多个长时间运行的控制台exe?_Python_Console_Subprocess_Multiprocessing_Exe - Fatal编程技术网

python多处理无法控制多个长时间运行的控制台exe?

python多处理无法控制多个长时间运行的控制台exe?,python,console,subprocess,multiprocessing,exe,Python,Console,Subprocess,Multiprocessing,Exe,我是Python的新手。我最近尝试使用Python脚本调用控制台exe,这是一个需要很长时间的过程。我将允许在CPU允许的范围内多次调用exe。当exe完成它的工作时。它应该将CPU释放到其他新作业中。所以我想我可能需要多过程控制机制 因为多处理只能调用python可调用函数。它不能直接调用控制台exe。我将subprocess.Popen(cmd)包装在一个python函数中。然而,在我这么做之后,我发现在使用multiprocessing.Process.start()之前。exe已启动。问

我是Python的新手。我最近尝试使用Python脚本调用控制台exe,这是一个需要很长时间的过程。我将允许在CPU允许的范围内多次调用exe。当exe完成它的工作时。它应该将CPU释放到其他新作业中。所以我想我可能需要多过程控制机制

因为多处理只能调用python可调用函数。它不能直接调用控制台exe。我将subprocess.Popen(cmd)包装在一个python函数中。然而,在我这么做之后,我发现在使用multiprocessing.Process.start()之前。exe已启动。问题是在它完成它正在做的事情之前(需要很长时间),它并没有将控制权返回给我。程序被冻结以等待。那不是我想要的

我发布的代码如下:

import sys 

import os 

import multiprocessing 

import subprocess  

def subprocessExe(cmd):

        return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE,creationflags=0x08000000)

if __name__ == '__main__': 

        p = multiprocessing.Process(target=self.subprocessExe(exeFileName))

        p.start()

        print p, p.is_alive()

谢谢你抽出时间

当您创建
多处理.Process
对象时,您正在调用
subprocessExec
。您应该这样做:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,))

然后它应该会工作。

在您的测试用例中有很多错误。以下是我的工作:

import multiprocessing, subprocess

def subprocessExe(cmd):
   subprocess.call([cmd], shell=False)

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',))
p.start()


我试过这个。它不起作用。Python自己的forking.py模块中出现错误。我使用的正是您在那里编写的。但是我的文件名有一个空格。因为它后面有论点。所以我的“cmd”类似于“*.exe xyz”。它与subprocess.Popen没有问题。但是如果我把整个字符串“cmd”放在multiprocessing.processing的arg中。它报告“picklingerror”错误,在cmd字符串中没有空格的情况下重试。只有一个exe文件。它仍然报告那个错误。我使用的是python 2.6。您可能还希望在p.start()之前添加
p.daemon=True
subprocess.call([cmd], shell=True)
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',))
subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE)