【问题标题】:Using os.popen() or subprocess to execute functions使用 os.popen() 或子进程执行函数
【发布时间】:2018-09-24 02:44:27
【问题描述】:

我目前正在研究线程、多进程和操作系统文档,以改进我的程序结构。但是老实说,其中一些很复杂,我无法在我的程序上实现它,要么它由于堆栈溢出而崩溃,要么得到错误的输入或根本没有输出。所以这是我的问题。

假设我有一个传递给函数的名称列表,并且该函数是我想在另一个控制台中运行的 - 当然是 python 解释器。并让它在那里运行一个完整的周期。

假设我有这个:

def execute_function(name, arg1, arg2):
   While True:
       #do something

for name in names:
   execute_function(name, arg1, arg2)

我应该使用什么来运行此函数以在 python 上以编程方式打开另一个控制台并在那里运行它While True: 是 subproccess/multiprocess/threading 还是 os.popen()

在这个例子中我应该如何执行?多处理池和进程总是和我一起崩溃。所以我认为这不是正确的解决方案。到目前为止,从我搜索的内容来看,我还没有看到与函数一起使用线程和子进程的示例。有解决方法吗?或者我可能错过了一个简单的解决方案?谢谢。

编辑:

类似的代码:

     if symbols is not None and symbols1 is not None:

         symbols = [x for x in symbols if x is not None]
         symbols1 = [x for x in symbols1 if x is not None]
         if symbol != None and symbol in symbols and symbol in symbols1:
              with Pool(len(exchanges)) as p:
                   p.map(bot_algorithm, (a, b, symbol, expent,amount))

http://prntscr.com/j4viat - 错误的样子

【问题讨论】:

  • 你能把崩溃的代码贴出来吗?
  • 您是否尝试让另一个控制台打开并运行您的脚本,或者您是否可以使用将在同一控制台中运行的后台进程/线程?
  • @deku,我们要求的不是您的原始代码,而是可以编写的最小/最简单的代码,让其他人产生同样的问题,测试他们提出的答案等。请参阅minimal reproducible example 定义和/或 Short, Self-Contained, Correct Example 定义。
  • os.popen 本质上只是subprocess.Popen 的包装,因此您使用的只是您想要对启动过程进行多少控制。
  • @deku。从概念上讲,我们要求您为您的问题付出尽可能多的努力,正如您期望我们所做的那样。正如现在所说,不是读心术的人可能无法为您提供太多帮助,因此您的问题更有可能被关闭而不是得到正确的答案。

标签: python multithreading multiprocessing subprocess python-multiprocessing


【解决方案1】:

subprocess总是通常优于os.system()

文档包含许多示例 - 在您的情况下,如果您想查看命令的结果,您的 execute_function() 函数可能需要使用 subprocess.check_output()

例如:

def execute_function(name, arg1, arg2):
  output = subprocess.check_output(["echo", name])
  print(output)

这一切不过是启动一个新进程,并等待它返回。虽然这在技术上是两个进程,但并不完全是您所说的多线程。

要使用同步运行多个子进程,您可以使用多处理库执行以下操作:

from multiprocessing.dummy import Pool

def execute_function(name, arg1, arg2):
  return subprocess.check_output(["echo", name])

names = ["alex", "bob", "chrissy"]

pool = Pool()

map_results = pool.map(execute_function, names)

这将一个迭代器(名称列表)映射到一个函数(execute_function)并一次运行它们。好吧,与您的机器一样多的内核一次。 map_results 是来自 execute_function 函数的返回值列表。

【讨论】:

  • 至少在 Python 3 中,os.popen 只是 subprocess.Popen 的包装,隐藏了你可能无论如何都不会使用的参数。你可能会想到os.system
  • 即使不清楚 OP 真正想要什么,这也可能会有所帮助
  • 我还是会说subprocess.Popen 总是比os.system 更可取; os.popensubprocess.Popen 的某些用途提供了一个更简单的接口,如果足够,您可以选择它。
  • 为什么always 被划掉了?它 总是优于os.system
  • @MadPhysicist call('ls') 仍然比 system('ls') 短。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2011-03-21
  • 2015-03-31
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多