Python:子进程还是不子进程到另一个Python子进程?

2024-04-19 17:41:30 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑了一个原始问题/帖子,以避免重复,同时又能切中要害。

我想知道,从已经运行的Python脚本内部将子进程转换为另一个Python脚本的执行是否是一种常见的做法?你知道吗

稍后编辑:

我得说子流程管道()将是一个选择,如果它用于运行一些外部进程(例如:其他应用程序或系统命令)。要“虚拟地”子进程当前正在运行的脚本的方法(或函数),multitreament是完全有意义的。你知道吗


Tags: 方法函数脚本应用程序编辑管道进程流程
2条回答

下面是一个工作代码,它利用多进程和子进程的popen()将文件从源复制到目标


import os, sys, subprocess
from multiprocessing import Pool


def copyUsingSubprocess(source):

    folder=os.path.dirname(source)
    srcFileName, srcFileExt=os.path.splitext(os.path.basename(source))
    destFilename=srcFileName+'_dest'+srcFileExt

    dest='/'.join([folder,destFilename])

    cmd=['cp', source, dest]

    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)


sources = ['/Volumes/files/a.data','/Volumes/files/b.data',
            '/Volumes/files/c.data','/Volumes/files/d.data',
            '/Volumes/files/e.data','/Volumes/files/f.data']

pool = Pool(20)
results = pool.map(copyUsingSubprocess, sources)

下面的是一个类似的代码。它确实使用了子流程.popen()执行文件复制。但它不需要调用多处理池.map()方法

import os, sys, subprocess

def copyUsingSubprocess(cmd):
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

sources = ['/Volumes/files/a.data','/Volumes/files/b.data',
            '/Volumes/files/c.data','/Volumes/files/d.data',
            '/Volumes/files/e.data','/Volumes/files/f.data']

for source in sources:
    folder=os.path.dirname(source)
    srcFileName, srcFileExt=os.path.splitext(os.path.basename(source))


    destFilename=srcFileName+'_dest'+srcFileExt
    dest='/'.join([folder,destFilename])


    cmd=['cp', source, dest]

    copyUsingSubprocess(cmd) 

从其他文件运行Python代码的通常方法是将其作为模块导入,并直接使用其中定义的对象:

# assert "/filepath/to" in sys.path
import your_script # import module defined in your_script.py

your_script.copyfile(srcfile, dest)

要在多个进程中运行Python代码,可以使用multiprocessing模块:

from multiprocessing import Pool
import your_script

def copyfile(srcfile):
    try:
        dest = ... srcfile ...
        your_script.copyfile(srcfile, dest)
    except Exception as e:
        return srcfile, None, str(e)
    else: 
        return srcfile, dest, None # no errors

def main():
    sources = [...]
    pool = Pool(20) # don't copy more that 20 files at once
    results = pool.map(copyfile, sources)

if __name__ == "__main__":
   main()

要使用线程而不是进程,只需更改导入:

from multiprocessing.dummy import Pool # use threads

目前尚不清楚并行IO操作对性能的影响。你知道吗

相关问题 更多 >