【问题标题】:Python, using os.system - Is there a way for Python script to move past this without waiting for call to finish?Python,使用 os.system - Python 脚本有没有办法在不等待调用完成的情况下通过它?
【发布时间】:2023-03-09 19:47:01
【问题描述】:

我正在尝试使用 Python(通过 Django 框架)进行 Linux 命令行调用,并尝试了 os.system 和 os.open 但对于这两种方法,似乎 Python 脚本在进行命令行调用后挂起因为调用是为了实例化服务器(所以它永远不会“完成”,因为它意味着长时间运行)。我知道用其他 Python 代码做这样的事情,你可以使用像 celery 这样的东西,但我认为有一种简单的方法可以让它只进行命令行调用而不是“绑定到它”,这样它就可以移动过去,我想知道我是否做错了什么......感谢您的任何建议。

我现在正在这样打电话

os.system("command_to_start_server")

也试过了:

response = os.popen("command_to_start_server")

【问题讨论】:

    标签: python django command-line os.system


    【解决方案1】:

    我不确定,但我认为带有 Popen 的 the subprocess module 比 os.popen 灵活得多。如果我没记错的话,它包括异步进程生成,我认为这就是您要寻找的。​​p>

    编辑: 我使用 subprocess 模块已经有一段时间了,但如果我没记错的话, subprocess.Popen 会立即返回,并且只有在您尝试与进程通信时(例如读取其输出)使用 subprocess.communicate 如果没有输出,您的程序是否会阻塞等待输出。

    【讨论】:

    • 谢谢,这听起来比我正在做的解决方案更好......当我通过一个对象进行 cmd 行调用时,会发生一些奇怪的“绑定”类型的行为最初是从 Django 发起的,我在 cmd 行上进行的调用是启动另一个测试服务器(在 diff 端口上),但不知何故,它绑定到了 Django 测试服务器,即使我可以正常运行它们,它也会导致 Django 测试服务器失败同时当我从 cmd 行手动启动它们时
    【解决方案2】:

    您可以使用django-celery。 django-celery 为 Django 提供了 Celery 集成。 Celery 是一个基于分布式消息传递的任务队列/作业队列。

    请参阅此http://ask.github.com/celery/getting-started/first-steps-with-django.html 了解如何使用它的教程。

    【讨论】:

      【解决方案3】:

      试试:

      os.system("command_to_start_server &>/dev/null &")
      

      【讨论】:

      • 谢谢,虽然它仍然给出了一些奇怪的行为,因为 Django 中的输出页面(即使它显示最终输出)无限期地显示“正在加载”......但是按照你说的做让它越过它“悬挂”的部分
      • 现在它将整个输出重定向到 /dev/null,所以页面上不会显示任何内容
      猜你喜欢
      • 2010-11-04
      • 2021-01-30
      • 2014-10-24
      • 2022-11-03
      • 1970-01-01
      • 2018-05-16
      • 2012-12-13
      相关资源
      最近更新 更多