如何在Python中启动后台进程?

我正在尝试将shell脚本移植到更易读的python版本。 原始shell脚本在后台使用“&”启动多个进程(实用程序,监视器等)。 如何在python中实现相同的效果? 我希望这些进程不会在python脚本完成时死掉。 我确信它与守护进程的概念有某种关系,但我无法轻易找到如何做到这一点。

Artem asked 2019-03-01T10:26:16Z

6个解决方案

299 votes

虽然jkp的解决方案有效,但更新的处理方式(以及文档推荐的方式)是使用subprocess.Popen()模块。 对于简单的命令,它是等价的,但是如果你想做一些复杂的事情,它会提供更多选项。

案例示例:

import subprocess

subprocess.Popen(["rm","-r","some.file"])

这应该在后台运行subprocess.Popen()。 但要小心:subprocess.Popen()只在后台运行进程,如果python脚本中没有任何内容依赖于正在运行的命令的输出:

例如,以下命令不会在后台运行:

import subprocess

ls_output=subprocess.Popen(["ls", "-a"], stdout=subprocess.PIPE)

请参阅此处的文档。

另外,澄清一点:“背景”纯粹是一个shell概念:你可能想要的是产生一个新的过程。 我在这里使用“背景”来引用类似shell的背景行为,但是不要将其误认为实际存在于后台的进程。

Dan answered 2019-03-01T10:28:12Z

65 votes

注意:此答案比2009年发布时的答案要少。现在,在文档中建议使用其他答案中显示的os.P_NOWAIT模块

(请注意,子进程模块提供了更强大的工具来生成新进程并检索其结果;使用该模块比使用这些函数更好。)

如果您希望您的进程在后台启动,您可以使用os.P_NOWAIT并以与shell脚本相同的方式调用它,或者您可以使用spawn:

import os

os.spawnl(os.P_DETACH, 'some_long_running_command')

(或者,您可以尝试使用较不便携的os.P_NOWAIT标志)。

请参阅此处的文档。

jkp answered 2019-03-01T10:26:57Z

32 votes

您可能想要“如何在Python中调用外部命令”的答案。

最简单的方法是使用system函数,例如:

import os

os.system("some_command &")

基本上,无论您传递给system函数的任何内容都将执行,就像您在脚本中将其传递给shell一样。

Eli Courtwright answered 2019-03-01T10:28:54Z

23 votes

我在这里找到了这个:

在Windows(win xp)上,父进程将无法完成,直到DETACHED_PROCESS完成其工作。 这不是你想要的CGI脚本。 问题不是Python特有的,在PHP社区中问题是一样的。

解决方案是将DETACHED_PROCESS进程创建标志传递给win API中的基础CreateProcess函数。 如果你碰巧安装了pywin32,你可以从win32process模块导入标志,否则你应该自己定义:

DETACHED_PROCESS = 0x00000008

pid = subprocess.Popen([sys.executable, "longtask.py"],

creationflags=DETACHED_PROCESS).pid

f p answered 2019-03-01T10:29:43Z

15 votes

使用subprocess.Popen()和close_fds=True参数,这将允许生成的子进程与Python进程本身分离,并在Python退出后继续运行。

[https://gist.github.com/yinjimmy/d6ad0742d03d54518e9f]

import os, time, sys, subprocess

if len(sys.argv) == 2:

time.sleep(5)

print 'track end'

if sys.platform == 'darwin':

subprocess.Popen(['say', 'hello'])

else:

print 'main begin'

subprocess.Popen(['python', os.path.realpath(__file__), '0'], close_fds=True)

print 'main end'

Jimmy Yin answered 2019-03-01T10:30:25Z

11 votes

您可能希望开始调查os模块以分叉不同的线程(通过打开交互式会话并发出帮助(os))。 相关函数是fork和任何exec函数。 为了让你了解如何启动,在执行fork的函数中放入这样的东西(函数需要将列表或元组'args'作为包含程序名称及其参数的参数;您可能还需要 为新线程定义stdin,out和err):

try:

pid = os.fork()

except OSError, e:

## some debug output

sys.exit(1)

if pid == 0:

## eventually use os.putenv(..) to set environment variables

## os.execv strips of args[0] for the arguments

os.execv(args[0], args)

Gerald Senarclens de Grancy answered 2019-03-01T10:30:53Z

python隐藏启动台_如何在Python中启动后台进程?相关推荐

  1. aws 删除ec2实例_如何在AWS中启动EC2实例

    aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何立即在AWS中旋转EC2实例. 您应该有权访问AWS控制台.如果您还没有AWS账户,则可以单击此处并在AWS上创建免费套餐. 如何在AWS ...

  2. python右对齐 数字_如何在Python中右对齐数值数据?

    我有一些数据,我显示在3列格式,形式"键:值键:键:值键:值".这里有一个例子: p: 1 sl: 10 afy: 4 q: 12 lg: 10 kla: 3 r: 0 kl: 1 ...

  3. python 指定证书验证_如何在python中验证SSL证书?

    我需要验证我的自定义CA签署了证书.使用OpenSSL命令行实用程序很容易做到: # Custom CA file: ca-cert.pem # Cert signed by above CA: bo ...

  4. python队列怎么用_如何在Python中使用多处理队列? - python

    我很难理解多处理队列如何在python上工作以及如何实现它.假设我有两个python模块,它们从共享文件中访问数据,我们将这两个模块称为writer和Reader.我的计划是让读取器和写入器都将请求放 ...

  5. python字符串筛选输出_如何在Python中过滤字符串列表

    Python使用列表数据类型在顺序索引中存储多个数据.它的工作方式类似于其他编程语言的数字数组.filter()方法是Python的一种非常有用的方法.可以使用filter()方法从Python中的任 ...

  6. python绘图背景透明_如何在 Matplotlib 中更改绘图背景

    介绍Matplotlib是Python中使用最广泛的数据可视化库之一.无论是简单还是复杂的可视化项目,它都是大多数人的首选库.在本教程中,我们将研究如何在Matplotlib中更改绘图的背景.导入数据 ...

  7. python获取当前时间戳_如何在Python中获取当前时间戳?

    在Python中可以使用来自模块time.datetime或calendar的函数来获取当前时间戳,代码语句如[import time;ts = time.time() print(ts)]. 在Py ...

  8. python静态变量计数器_如何在Python中使用静态变量在计数

    今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题.如何在Python中使用静态变量来计数.然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量.说实话没 ...

  9. python的loc函数_如何在pandas中使用loc、iloc函数进行数据索引(入门篇)

    在数据分析过程中,很多时候我们需要从数据表中提取出我们需要的部分,而这么做的前提是我们需要先索引出这一部分数据.今天我们就来探索一下,如何在pandas中使用loc函数和iloc函数索引数据. 今天我 ...

最新文章

  1. 企业工作流程化重要吗?
  2. 5.2 计算机网络之传输层UDP协议
  3. 万能数据库查询分析器使用技巧之(十四)
  4. Robot Framework--环境搭建
  5. 大一matlab知识整理,MATLAB基础课程 第二章 MATLAB绘图知识(5)
  6. enablePullDownRefresh的使用
  7. 小熊派折叠开发板Docker编译烧录安装HAP
  8. C#2.0泛型中的变化: default 关键字
  9. CentOS7:搭建SVN + Apache 服务器
  10. 机电传动控制大作业第一阶段
  11. 简单算术表达式计算器
  12. C语言进制转换以及原补反码位运算介绍
  13. VS2010快捷键大全
  14. sumif单列求和_Sumif、Sumifs单列多条件求和-阿里云开发者社区
  15. Java多线程系列--【JUC集合09】- LinkedBlockingDeque
  16. 百度mip推送工具_(教程)主动推送(实时)、熊掌号天级/周级提交、MIP提交
  17. 火狐浏览器截图整个网页截图 截取整个网页
  18. Word文档排版——自动编号
  19. 软件测试缺陷指标,如何对缺陷进行分析,都分析哪些指标?
  20. idea2023闪退原因

热门文章

  1. java重命名package_AndroidStudio怎么重命名java目录下的包名(如cn.zsn.app)
  2. curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
  3. kafka集群脚本启动失败,在kafkaServer.out中提示nohup: failed to run command `java’: No such file or directory
  4. matlab函数冒号代表的意思,MATLAB中冒号运算符的含义
  5. 图形驱动程序和显卡驱动什么区别_以后你的手机也需要单独安装显卡驱动程序了...
  6. sq服务启动后又停止_SQL SERVER SQL Agent  服务启动后又停止的解决办法
  7. mysql 字段等于select_mysql_select_计算字段_数据处理函数_5
  8. Win11如何开启旧版组件 Win11开启旧版组件的方法
  9. 如何在Chrome浏览器中创建账户?
  10. Windows平台RTMP|RTSP播放器实现画面全屏功能