【问题标题】:Running multiple Python scripts运行多个 Python 脚本
【发布时间】:2014-06-11 13:16:13
【问题描述】:

我想创建一个简单的 Python 程序,它可以同时执行 2 个独立的脚本。目前,这两个脚本只是打印一个数字序列,但我打算在未来使用这个程序同时运行一些 Twitter 流媒体程序。

我怀疑我需要使用subprocess.Popen,但我无法完全理解我应该在那里输入哪些参数。 StackOverflow 上有一个类似的问题,但那里提供的代码(粘贴在下面)没有打印任何内容。感谢您的帮助。

我的文件是:

thread1.py
线程2.py

import subprocess

subprocess.Popen(['screen', './thread1.py']))
subprocess.Popen(['screen', './thread2.py'])

【问题讨论】:

  • 在 Unix 中使用管道运行并行进程不是更简单更明显吗? IE。 ./thread1.py;./thread2.py
  • 是的,普通的 Unix 进程管道可以解决问题。只是提醒一下,如果操作是 i/o 绑定的,您应该考虑在 Python 中使用线程而不是进程。
  • 谢谢,我已经尝试了你的建议:python ./thread1.py;./thread2.py 但我只从第一个脚本中获取打印的数字,我想要两个脚本同时运行。
  • 由于管道使用,您应该将两个脚本作为单独的 python 程序运行:python thread1.py;python thread2.py。在您的情况下,我假设您没有 python preambula,因此您的脚本需要使用 python 解释器,如上所述。这就是为什么你的第二个脚本没有运行的原因。请注意,您应该在文件所在的目录中,并且不需要“./”前缀,表示您从当前文件夹中获取文件。
  • 我尝试将上述 Unix 方法用于两个下载 Twitter 时间线的脚本。不幸的是,这些脚本似乎不是并行运行的。我的每个脚本都构建了一个单独的 MySQL 表,我可以看到第二个脚本的表只有在我中断第一个脚本后才开始构建。这是@AashishP 提到的情况吗?我应该使用线程吗?

标签: python multiprocessing


【解决方案1】:

使用supervisord

supervisord 是进程控制系统,仅用于运行多个命令行脚本。

它的特点:

  • 多个受控进程
  • 自动重启失败的运行
  • 记录标准输出和标准错误输出
  • 按顺序启动脚本(使用优先级)
  • 用于查看最新日志输出、停止、启动、重新启动进程的命令行实用程序

此解决方案仅适用于基于 *nix 的系统,不适用于 Windows。

【讨论】:

    【解决方案2】:

    正如wanderlust提到的,你为什么要这样做而不是通过linux命令行?

    否则,您发布的解决方案正在做它应该做的事情,即您在命令行中执行此操作:

    screen ./thread1.py
    screen ./thread2.py
    

    这将打开一个屏幕会话并在此屏幕会话中运行程序和输出,这样您就不会直接在终端上看到输出。要解决您的输出问题,只需执行脚本而不使用屏幕调用:

    import subprocess
    
    subprocess.Popen(['./thread1.py'])
    subprocess.Popen(['./thread2.py'])
    

    thread1.py的内容:

    #!/usr/bin/env python
    def countToTen():
      for i in range(10):
      print i
    
    countToTen()
    

    thread2.py的内容:

    #!/usr/bin/env python
    def countToHundreds():
    for i in range(10):
      print i*100
    
    countToHundreds()
    

    那么别忘了在命令行中执行此操作:

    chmod u+x thread*.py
    

    【讨论】:

    • 谢谢,我已经尝试使用上述脚本(在 IDLE 中),但我遇到了很多错误。回溯(最后一次调用):第 3 行,在 subprocess.Popen(['./thread1.py']) 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ subprocess.py”,第 709 行,在 init errread, errwrite) 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第 1326 行,在 _execute_child raise child_exception OSError: [Errno 13] Permission denied
    • 这很可能与你的'thread1'和'thread2'的内容有关。你能提供任何细节吗?
    • 当然,我得到了 UNIX 解决方案,但我很好奇我的 subprocess.Popen 出了什么问题。这是thread1:'def countToTen():for i in range(10):打印i countToTen()'和thread2:'def countHundreds():for i in range(10):打印i * 100 countHundreds()'我'运行此代码时出现错误:'import subprocess subprocess.Popen(['thread1.py']) subprocess.Popen(['thread2.py'])' P.S 抱歉我的格式错误,我需要学习如何在这里格式化
    • 您缺少 thread1.py 和 thread2.py 前面的“./”。此外,在每个文件 thread1.py 和 thread2.py 中,您需要指向 python 可执行文件,即“#!/usr/bin/env python”。您还需要使它们可执行,即“chmod u+x thread*.py”。否则,它应该可以按您的意愿工作。我将编辑我的帖子以包含此内容。
    • 谢谢,它现在可以从命令行运行(但如果我只是尝试从 IDLE 运行它,但也许你不能在那里运行并发程序)。我需要阅读“chmod”行,但这对 Python 初学者来说是非常有价值的一课。
    【解决方案3】:

    您也可以只打开几个命令提示符窗口来一次运行多个 Python 程序 - 只需在每个程序中运行一个:

    在每个命令提示符窗口中,转到正确的目录(例如 C:/Python27),然后在一个命令提示符窗口中键入 'python YourCodeNo1.py','python YourCodeNo2.py' 在下一个等。 .

    我目前正在以这种方式一次运行 3 个代码,而不会减慢任何一个代码。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2017-12-12
      • 1970-01-01
      • 2021-12-19
      • 2016-06-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多