我正在尝试将shell脚本移植到可读性更强的python版本。原来的shell脚本使用“&”在后台启动几个进程(实用程序、监视器等)。如何在python中实现相同的效果?我希望这些进程在python脚本完成时不死亡。我确信这与守护进程的概念有关,但我不知道如何轻松地做到这一点。
当前回答
你可能想知道“如何在Python中调用外部命令”的答案。
最简单的方法是使用操作系统。系统功能,例如:
import os
os.system("some_command &")
基本上,无论您传递给系统函数的是什么,都将像在脚本中传递给shell一样执行。
其他回答
我在这里找到了这个:
在windows (winxp)上,父进程直到longtask.py完成它的工作才会结束。这不是你在cgi脚本中想要的。这个问题并不局限于Python,在PHP社区也存在同样的问题。
解决方案是将DETACHED_PROCESS进程创建标志传递给win API中的底层CreateProcess函数。如果你碰巧安装了pywin32,你可以从win32process模块导入这个标志,否则你应该自己定义它:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen([sys.executable, "longtask.py"],
creationflags=DETACHED_PROCESS).pid
你可能想知道“如何在Python中调用外部命令”的答案。
最简单的方法是使用操作系统。系统功能,例如:
import os
os.system("some_command &")
基本上,无论您传递给系统函数的是什么,都将像在脚本中传递给shell一样执行。
你可以使用
import os
pid = os.fork()
if pid == 0:
Continue to other code ...
这将使python进程在后台运行。
使用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'
注:与2009年发布的答案相比,这个答案没有那么流行。现在建议在文档中使用其他答案中显示的subprocess模块
(注意,subprocess模块为生成新进程和检索其结果提供了更强大的功能;使用该模块比使用这些函数更可取。)
如果你想让你的进程在后台启动,你可以使用system()并像你的shell脚本一样调用它,或者你可以衍生它:
import os
os.spawnl(os.P_DETACH, 'some_long_running_command')
(或者,你也可以试试不那么便携的操作系统。P_NOWAIT国旗)。
请在这里查看文档。
推荐文章
- 如何用OpenCV2.0和Python2.6调整图像大小
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求
- 如何检查一个对象是否是python中的生成器对象?