Python中的os.sytem()提供无限循环
我的主Python脚本导入2个其他脚本;Test1.py和Test2.py Test1.py执行多处理,Test2.py执行一个简单的os.system('ls')命令。当Test1.py完成并调用Test.py时,os.system(ls)会变得疯狂,并创建无限的新进程。有人知道为什么会这样吗Python中的os.sytem()提供无限循环,python,process,operating-system,subprocess,multiprocessing,Python,Process,Operating System,Subprocess,Multiprocessing,我的主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, f
# 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()
py应该执行一个简单的ls命令,而不是停止生成新命令
def worker():
command = 'ls'
os.system(command)
当查看脚本启动后的进程时,function1之后的进程似乎也没有正确关闭。通过Taskmanager,我仍然可以看到5个额外的pythonw.exe,它们似乎没有任何作用。只有当我关闭打开的外壳时,它们才会消失。这可能与为什么os.system(命令)在函数2中变得疯狂有关?有人有解决方案吗?因为脚本还没有完成,所以我无法关闭shell,因为它还必须执行function2
编辑:在试图找到解决方案时,function1开始时多次执行function(2)中的命令,然后执行perl命令。更奇怪的是。似乎每次导入主模块时都会执行doSomething()
,并且可以在工人初始化期间通过多处理多次导入。您可以通过在Test2.worker()
中打印进程pid:print(os.getpid())
来检查它
如果在模块级使用
,则应使用。如代码所示,在函数内部执行此操作很容易出错
import multiprocessing
# ...
if __name__ == '__main__': # at global level
multiprocessing.freeze_support()
main() # it calls do_something() and everything else
请参见中的第一个注释。上面的列表中有一些奇怪的地方。如何键入
importtest2.py
而不出错?import语句使用的是模块名,没有“.py”部分,而不是完整的文件名。您在Windows上吗?Mulitprocessing说,“确保新的Python解释器可以安全地导入主模块,而不会产生意外的副作用(比如启动新进程)。”这可能是问题的原因吗?您的main正在通过map
启动新进程,不是吗?无关:不要使用stdout=PIPE
,除非在进程运行时从它读取,否则进程。wait()
将永远等待。尝试子流程。检查输出()
和os.path.join()
以使您的代码正常工作。我希望您只是将“ls”用作测试,而不是认真使用此方法获取目录列表。有更好的方法可以做到这一点。