【发布时间】:2014-05-01 14:17:09
【问题描述】:
我的主要 Python 脚本导入了 2 个其他脚本; Test1.py 和 Test2.py。
Test1.py 执行多处理,Test2.py 执行一个简单的 os.system('ls') 命令。当 Test1.py 完成并调用 Test.py 时,os.system(ls) 变得疯狂并创建了无限的新进程。有谁知道为什么会这样?
# Main
import multiprocessing
import Test1.py
import Test2.py
def doSomething():
# Function 1, file1...file10 contain [name, path]
data = [file1, file2, file3, file4, file5, file6, file7, file8, file9, file10]
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=min(len(data), 5))
print pool.map(Test1.worker, data)
# Function 2
Test2.worker()
Test1.py;调用 perl 命令
def worker(data):
command = 'perl '+data[1].split('data_')[0]+'methods_FastQC\\fastqc '+data[1]+'\\'+data[0]+'\\'+data[0]+' --outdir='+data[1]+'\\_IlluminaResults\\_fastqcAnalysis'
process = subprocess.Popen(command, stdout=subprocess.PIPE)
process.wait()
process.stdout.read()
Test2.py 应该执行一个简单的 ls 命令,而不是它永远不会停止执行新命令;
def worker():
command = 'ls'
os.system(command)
如果脚本启动,则查看进程时,似乎 function1 之后的进程也没有正确关闭。通过任务管理器,我仍然看到 5 个额外的 pythonw.exe 似乎没有做任何事情。只有当我关闭打开的外壳时,它们才会消失。这可能与为什么 os.system(command) 在函数 2 中变得疯狂有关?有没有人有解决方案,因为我无法关闭 shell,因为脚本还没有完成,因为它仍然需要执行 function2?
编辑:当试图找到解决方案时,还发生了 function1 从多次执行 function(2) 的命令开始,然后是 perl 命令。更奇怪的是。
【问题讨论】:
-
上面的列表中有一些奇怪的地方。如何输入
import Test2.py而不出现错误? import 语句使用模块名称,没有“.py”部分,而不是完整的文件名。 -
您在 Windows 上吗? Mulitprocessing 的programming guidelines 说:“确保主模块可以被新的 Python 解释器安全地导入,而不会导致意外的副作用(例如启动新进程)。”这可能是您的问题的原因吗?你的主要是通过
map启动新进程,不是吗? -
不相关:不要使用
stdout=PIPE,除非您在进程运行时从中读取,否则process.wait()将永远等待。试试subprocess.check_output()和os.path.join()让你的代码工作 -
我希望您仅将“ls”用作测试-并且您没有认真使用此方法来获取目录列表。有更好的方法来做到这一点。
标签: python process operating-system subprocess multiprocessing