【问题标题】:os.sytem() in Python gives infinite loopPython 中的 os.system() 给出了无限循环
【发布时间】: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


【解决方案1】:

似乎每次导入主模块时都会执行doSomething(),并且在worker初始化期间multiprocessing可以多次导入它。您可以通过打印进程 pid: print(os.getpid()) in 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 中的第一个注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2015-11-20
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多