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