如何用Anaconda在后台运行Python脚本?nohup命令失效求助
Anaconda环境下Python脚本后台运行失败的解决办法
先说说我的情况:我写了个简单的Python脚本test.py,代码如下:
import time import logging logging.basicConfig(filename='app.log', filemode='w', level=logging.DEBUG) i=0 while i<100: i+=1 logging.info(i) print(i) time.sleep(1)
本来想靠Anaconda让它在后台跑,试了nohup python -u test.py &——虽然本机Python已经关联了Anaconda环境,但脚本死活和终端绑定在一起:关终端就停,用exit关终端直接变黑卡着关不了,点X关闭终端也跟着停。求正确的后台运行姿势?
附我的conda信息:
$ conda info active environment : None conda version : 4.9.2 conda-build version : 3.20.5 python version : 3.8.5.final.0 virtual packages : __win=0=0 __archspec=1=x86_64 base environment : F:\Automation\Anaconda3 (read only) channel URLs : https://repo.anaconda.com/pkgs/main/win-64 https://repo.anaconda.com/pkgs/main/noarch https://repo.anaconda.com/pkgs/r/win-64 https://repo.anaconda.com/pkgs/r/noarch https://repo.anaconda.com/pkgs/msys2/win-64 https://repo.anaconda.com/pkgs/msys2/noarch platform : win-64 user-agent : conda/4.9.2 requests/2.24.0 CPython/3.8.5 Windows/10 Windows/10.0.17763 administrator : False netrc file : None offline mode : False
我用的运行终端是Git,版本2.29.2.windows.3
解决办法
你这问题核心是Windows环境下Git Bash的nohup和Linux下表现不一样,而且Windows本身的后台进程管理逻辑和Linux有区别,给你几个亲测有效的方法:
方法1:用Anaconda Prompt + Windows原生start /B命令
这是最稳定的Windows本地方案,完全和终端解绑:
- 打开Anaconda Prompt(如果需要特定环境,先激活,比如
conda activate myenv;没特殊需求直接用base环境就行) - 切换到脚本所在文件夹:
cd D:\your_script_path - 执行后台启动命令:
start /B python test.py
- 要是不想让输出占着控制台,直接把所有输出(包括错误)重定向到日志文件:
start /B python test.py > output.log 2>&1
这样脚本彻底在后台跑,关了Anaconda Prompt也不受影响。
方法2:Git Bash里用nohup配合disown断开关联
Git Bash的nohup默认还是会和终端绑定,得加一步断开关联:
- 先执行
nohup python -u test.py & - 马上输入
disown -h %1(这里%1是刚才后台进程的job编号,不确定的话输jobs就能看到列表)
做完这步再关Git Bash,脚本就会继续在后台运行了,不会跟着终端一起停。
方法3:指定conda环境后台启动
如果你的脚本需要特定的conda环境,直接把激活命令和启动命令合并就行:
在Anaconda Prompt里执行:
start /B cmd /c "conda activate myenv && python test.py > output.log 2>&1"
用cmd /c会执行完命令就关闭临时的cmd窗口,彻底后台运行;要是想留着窗口看输出,换成cmd /k就行。
几个小提醒
- 别刚运行后台进程就用Git Bash的
exit命令关窗口,容易卡黑屏,用disown之后再关就没问题。 - 要停后台脚本的话,打开任务管理器,找到对应的
python.exe进程结束就行。 - 你的脚本里
logging.basicConfig的filemode='w'是清空日志再写,要是长时间运行建议改成filemode='a'(追加模式),不然每次重启都会丢之前的日志。
内容的提问来源于stack exchange,提问作者Syed Afsahul Haque
相关产品推荐
相关产品推荐

