Python中的os.system()给出了无限循环

时间:2014-05-01 14:17:10

标签: 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, 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之后的进程也没有正确关闭。通过Taskmanager,我仍然看到5个额外的pythonw.exe似乎什么也没做。只有当我关闭打开的外壳时,它们才会消失。这可能与os.system(命令)在函数2中疯狂的原因有关?有没有人有解决方案,因为我无法关闭shell,因为脚本还没有完成,因为它仍然需要执行function2?

编辑:当试图找到解决方案时,也发生了function1从多次执行函数(2)的命令开始,之后是perl命令。这更奇怪。

1 个答案:

答案 0 :(得分:0)

每次导入主模块时都会执行doSomething(),并且在工作人员初始化期间可以multiprocessing多次导入它。您可以通过print(os.getpid())中的打印流程pid Test2.worker()进行检查。

您应该在模块级别使用if __name__ == '__main__': 。在代码显示的函数内部执行此操作非常容易出错。

import multiprocessing

# ...

if __name__ == '__main__': # at global level
    multiprocessing.freeze_support()
    main() # it calls do_something() and everything else

请参阅the introduction to multiprocessing中的第一个注释。