Python:是否将子进程分为另一个Python子进程? 编辑原始问题/帖子,以避免重复,但又不触及要点。

Python:是否将子进程分为另一个Python子进程? 编辑原始问题/帖子,以避免重复,但又不触及要点。,python,cmd,subprocess,Python,Cmd,Subprocess,我想知道从已经在运行的Python脚本中执行子进程到另一个Python脚本中是否是一种常见的做法 稍后编辑: 如果subprocesss.Pipe()用于运行某些外部进程(例如:其他应用程序或系统命令),则可以选择subprocesss.Pipe()。要“虚拟地”处理当前正在运行的脚本的方法(或函数),Multitreament完全有意义。从不同文件运行Python代码的常用方法是将其作为模块导入,并直接使用其中定义的对象: # assert "/filepath/to" in sys.path

我想知道从已经在运行的Python脚本中执行子进程到另一个Python脚本中是否是一种常见的做法

稍后编辑:
如果subprocesss.Pipe()用于运行某些外部进程(例如:其他应用程序或系统命令),则可以选择subprocesss.Pipe()。要“虚拟地”处理当前正在运行的脚本的方法(或函数),Multitreament完全有意义。

从不同文件运行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操作对性能有何影响

下面是一段工作代码,它利用多处理和子进程的popen()将文件从源复制到目标。
下面的代码与此类似。它也使用subprocess.popen()执行文件复制。但是它不需要调用多处理的Pool.map()方法就可以做到这一点。

可能重复感谢Joran,我刚刚编辑了OP。您能说明您的代码有哪些问题吗?它会产生错误吗?这对你来说太慢了吗?(我看到代码中存在多个问题,但如果它对您有效,那么这是一个问题)我想知道通过subprocess.popen()直接调用python可执行文件来对另一个python进程进行子处理是否是一种正确的方法。或者如果应该避免的话。如果应该避免,那么为什么呢?您是否尝试过
exec
函数?从不同的进程调用
Popen()
是没有意义的
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)
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)