我想要做的是有一个python脚本(这是一个python IRC bot),它可以在后台/单独运行另一个python脚本。
我可以这样做:
#irc codey stuff here...
if x == y:
os.system('s%\stuff.py') % path
但这会停止 main.py ,然后运行 stuff.py (在1个命令提示符下),我不想这样做。
所以我试图让这个脚本做的是当IRC机器人通过IRC获取命令时,我希望它分别运行stuff.py,比如双击 stuff.py 并拥有 main.py 和 stuff.py 同时运行。
如果在windows / linux中有另外一种方法,请同时显示两者吗?
答案 0 :(得分:5)
要生成后台进程,请在子进程模块中使用Popen类。
示例:
from subprocess import Popen
process = Popen(['firefox', '-P', '-no-remote'])
此process
之后是一个可以用来杀死进程的进程对象,等待它完成,与之通信等等。如果你只想生成进程并忘记它,你就不要需要保持Popen的返回值。
答案 1 :(得分:1)
subprocess库可能很有用。它允许后台进程并为您处理一些分叉和子管理。
答案 2 :(得分:1)
要在Windows中打开单独的shell,您可以执行以下操作:
os.system('cmd.exe /c stuff.py')
或者,正如其他人所指出的那样,使用subprocess
模块。实际上,subprocess
应该是一个反射 - 当你开始其他过程时你抓住的工具......
答案 3 :(得分:0)
要在后台执行CPU密集型Python代码,可以使用multiprocessing
:
import multiprocessing as mp
from stuff import some_function
if __name__=='__main__':
pool = mp.Pool()
# ...
if x == y:
pool.apply_async(some_function, args) # use mp.Queue or
# save returned value or
# specify a callback
# to get deferred result from the function
如果你走subprocess
路线然后使用与当前脚本相同的Python启动器,你可以尝试sys.executable
:
import os
import sys
from subprocess import Popen
p = Popen([sys.executable, os.path.join(path, 'stuff.py')])