后台运行 Python

后台运行 Python

如何运行

在后台运行 Python 程序的方式取决于操作系统以及具体需求(是否需要退出后继续运行、查看输出等)。以下是几种常用方法:

1. 使用 & (Linux/Unix/MacOS)

在命令末尾加上 &,可以让程序在后台运行。

示例:
python your_script.py &
  • 优点:简单快速。
  • 缺点:如果关闭终端,程序也会终止。

2. 使用 nohup (Linux/Unix/MacOS)

nohup 允许程序在终端关闭后继续运行。

示例:
nohup python your_script.py > output.log 2>&1 &
  • > \gt > output.log:将标准输出保存到 output.log 文件。
  • 2>&1:将标准错误输出重定向到标准输出。
查看运行状态:
jobs
停止任务:

找到对应的进程号(PID),然后用 kill 命令结束任务:

ps -ef | grep your_script.py
kill PID

3. 使用 screen 或 tmux (Linux/Unix/MacOS)

这两个工具允许创建虚拟终端,程序可以在其中运行,即使断开连接也不会中断。

使用 screen:
  1. 启动一个新的 screen 会话:
screen -S my_session
  1. 在会话中运行程序:
python your_script.py
  1. 按下 Ctrl+A,然后按 D 来退出到后台。
  2. 重新进入会话:
screen -r my_session
使用 tmux:

类似于 screen,更加现代化,命令类似。

4. 使用 Windows 的 start 命令

在 Windows 中,可以用 start 在后台运行 Python 程序。

示例:
start python your_script.py

5. 使用任务调度工具

(Linux/Unix/MacOS)

使用 cronsystemd 来安排脚本运行。

(Windows)

使用「任务计划程序」运行脚本。

6. 使用 Process Manager(如 Supervisor 或 PM2)

  • Supervisor:适合管理长期运行的 Python 脚本。
  • PM2:通常用于 Node.js,也支持 Python 程序。
示例 (PM2 安装后运行):
pm2 start your_script.py --interpreter=python3

7. 使用 Python 的多线程或守护进程

用 Python 自带的库运行守护程序,例如:

import threadingdef your_function():while True:print("Running in the background...")time.sleep(10)thread = threading.Thread(target=your_function, daemon=True)
thread.start()

总结

方法平台是否支持断开后继续运行备注
&Linux/MacOS简单但不能断开终端
nohupLinux/MacOS常用,适合简单脚本
screenLinux/MacOS虚拟终端,多任务管理
tmuxLinux/MacOS更现代的虚拟终端
startWindows适合 Windows 的简单运行
守护进程所有平台高级用法,需手动编写代码

根据需求选择合适的方案即可!

出现引入模块不存在怎么办?

在执行某个测试模块时出现提示,显示自定义模块data不存在,但是在PyCharm下运行正常。错误信息如下:

Traceback (most recent call last):File "XXX.py", line 2, in <module>from data import *
ModuleNotFoundError: No module named 'data'

大部分情况下,此类问题是由于包的路径没有设置正确所致。通过打印 PyCharm 和命令行下的 sys.path 路径信息对比,可以发现以下差异:
在当前目录下__init__添加

import sys
print("系统路径",sys.path)

解决方法

向执行代码中添加根目录路径,一般添加在头部

方法一:写死绝对路径
import sys
sys.path.append('xxx/xxx/xxx/')
方法二:使用os获取

os.path.dirname获取目录,此处就是获取目录的父目录。如果目录层级更多,就需要多加一层 os.path.dirname

import os,sys
project_root =  os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_root)
方法三:os获取+/…/

如果层级更多,则需要多加"…/" ,看起来比方法二更加简洁点

import os,sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../')
方法四,直接加到环境变量path中

输入以下命令

export PYTHONPATH=$PYTHONPATH:/xxx/

export 命令输入只临时生效,重新连接会失效,或者直接修改环境配置~/.bashrc等配置加上这句可以实现永久解决问题,如果这个不能实现,考虑自己手动去执行添加

方法五,subprocess.run 使用env变量

有些人是在subprocess去执行脚本,这个时候用上述的方法就不太能永久解决问题。我们可以使用subprocess的env参数去做,代码如下

def run_script(self, script_path, *args):# 运行 Python 脚本path_parts = script_path.split('/')export_commands = []for i in range(1, len(path_parts)):path_part = '/'.join(path_parts[:i])export_commands.append(f'{path_part}')env = os.environ.copy()env['PYTHONPATH'] = ':'.join(export_commands) + ':' + env.get('PYTHONPATH', '')# print(f"env{env}")script_dir = os.path.dirname(script_path)command = [f'{self.venv_path}/bin/python3', script_path] + list(args)return self.run_command(command,cwd=script_dir,env=env)
def run_command(self, command, shell=False,cwd=None,env=None) -> Tuple[int, str]:# 执行命令result = subprocess.run(command, shell=shell, capture_output=True, text=True,cwd=cwd,env=env)print(f"returncode:{result.returncode}")return result.returncode

通过script_path地址变量解析,添加所有的路径到环境变量中,然后给subprocess.run做继承,subprocess.run如果不继承的,每开一个会话,都是新的变量环境。

总结:
可能还有其他方法,但大体上找不到module的问题,大部分是路径变量问题,按照这个思路去解决就可以解决大部分类似问题。

如果输出文件中没有内容怎么办?

如果使用以下命令运行 Python 脚本时:

nohup python your_script.py > output.log 2>&1 &

而输出文件 output.log 中没有 print 语句的内容,可能是由于以下原因:

1. 输出被缓冲(最常见原因)

在 Python 中,标准输出(sys.stdout)默认是行缓冲全缓冲模式,尤其是当输出被重定向到文件时。这意味着 print 的内容可能会积累在缓冲区中,直到程序结束或缓冲区满时才会写入到文件。

解决方法:

在脚本中强制关闭缓冲,使用以下任意方法:

  1. 在 print 中加 flush=True:
    修改所有 print 调用,强制刷新输出缓冲区。
print("This is a test message", flush=True)
  1. 运行脚本时禁用缓冲:
    在运行命令中添加 -u 参数,这会使 Python 以无缓冲模式运行:
nohup python -u your_script.py > output.log 2>&1 &
  1. 手动刷新缓冲:
    使用 sys.stdout.flush() 在每次输出后刷新缓冲。
import sys
print("This is a test message")
sys.stdout.flush()

2. print 输出到了 stderr

有时,print 输出意外地被写入了 stderr,而不是 stdout,可能由于代码中修改了标准输出流。

解决方法:

确保你的命令正确重定向了 stderrstdout,如:

nohup python your_script.py > output.log 2>&1 &

其中 2>&1 将标准错误重定向到标准输出。

3. print 被捕获或重定向

如果脚本内部重定向了 sys.stdout,例如将输出流写到了其他地方,则 print 不会写入到默认输出。

解决方法:

检查代码中是否有类似以下操作:

import sys
sys.stdout = open("another_log.txt", "w")
  • 如果有,请注释掉或修改它。

4. 输出文件路径问题

确认 output.log 的路径是否正确,或者脚本是否有权限写入该路径。

检查方法:
  1. 确认文件是否创建:
ls -l output.log
  1. 检查写入权限:
touch output.log

5. 脚本没有运行成功

如果脚本未成功启动,可能导致没有输出。

检查方法:
  1. 确认脚本是否运行:
ps -ef | grep your_script.py
  1. 查看 nohup.out 文件:
    如果没有指定 > output.log,默认输出到 nohup.out 文件,检查其中是否有相关信息。

总结

最可能的原因是 缓冲问题,可以通过以下方式解决:

nohup python -u your_script.py > output.log 2>&1 &

或者在脚本中修改 print

print("Hello, World!", flush=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LS1046 XFI网口接近10Gbps

硬件平台&#xff1a; CPU LS1046A 1.8GHZ 软件平台&#xff1a; LINUX 4.19.32 BUILDROOT 测试软件&#xff1a; ipferf 整个过程比较曲折&#xff0c;网口默认不能达到这个速度&#xff0c;只有2Gbps以内。需要FMC配置后才能达到9.4Gbps。

逆向安卓抓包

打开Mumu网易&#xff0c;打开设置&#xff0c;打开其他&#xff0c;开启root权限 打开Mumu网易&#xff0c;找到apk安装藏航准备网.apk charles配置&#xff1a;proxy setting 端口9888 查看当地IP:help--->local IP address SSL Proxying Setting--->Add---->IP…

大数据安全需求分析与安全保护工程

26.1 威胁与需求分析 1&#xff09;概念发展 2&#xff09;威胁分析 数据集 安全边界日渐模糊&#xff0c;安全保护难度提升 敏感数据泄漏安全风险增大 数据失真与大数据污染安全风险 大数据处理平台业务连续性与拒绝服务 个人数据广泛分布于多个数据平台&#xff0c;隐…

MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分

MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分 目录 MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分MOE划分不同专家的方法K-Means聚类算法来实现将神经元特征聚类划分成不同专家(行或者列聚类)举例说明怎么聚类,最后神经网络怎么保存M…

一则问答:211集成电路专业,转互联网还是FPGA?

问&#xff1a; 我于2016年毕业于西安电子科技大学集成电路设计与集成系统专业。毕业后&#xff0c;我在一家不知名私企从事PCB绘制和单片机调试工作&#xff0c;持续了一年半。之后&#xff0c;我受律师职业光鲜外表的吸引&#xff0c;尝试了两年的司法考试&#xff0c;但未能…

嵌入式linux系统中QT信号与槽实现

第一:Qt中信号与槽简介 信号与槽是Qt编程的基础。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。 槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。 案例操作与实现: #ifndef …

《OpenCV 5.0.0-alpha:开启计算机视觉新篇章》

《OpenCV 5.0.0-alpha&#xff1a;开启计算机视觉新篇章》 OpenCV 5.0.0-alpha 重磅登场一、OpenCV 5.0.0-alpha 初窥二、核心新特性深度剖析&#xff08;一&#xff09;性能飙升的底层优化&#xff08;二&#xff09;深度学习模块进阶&#xff08;三&#xff09;扩展功能的魅力…

Python自学 - 函数初步(内置函数、模块函数、自定义函数)

1 Python自学 - 函数初步(内置函数、模块函数、自定义函数) 1.1 内置函数 几乎所有的编程都会提供一些内置函数&#xff0c;以便完成一些最基本的任务&#xff0c;Python提供了丰富的内置函数&#xff0c;熟悉内置函数可以给工作带来极大便利。   Python官方的内置函数介绍网…

Java Web开发进阶——Spring Boot基础

Spring Boot是基于Spring框架的新一代开发框架&#xff0c;旨在通过自动化配置和简化的开发方式提升生产效率。它将复杂的配置抽象化&#xff0c;让开发者专注于业务逻辑实现&#xff0c;而无需关注繁琐的基础配置。 1. Spring Boot简介与优势 Spring Boot 是 Spring 家族中的…

LLM 训练中存储哪些矩阵:权重矩阵,梯度矩阵,优化器状态

LLM 训练中存储哪些矩阵 目录 LLM 训练中存储哪些矩阵深度学习中梯度和优化器是什么在 LLM 训练中通常会存储以下矩阵: 权重矩阵:这是模型的核心组成部分。例如在基于 Transformer 架构的 LLM 中,每一层的多头注意力机制和前馈神经网络都会有相应的权重矩阵。以 BERT 模型为…

探索 ES6 Set:用法与实战

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用SSH建立内网穿透,能够访问内网的web服务器

搞了一个晚上&#xff0c;终于建立了一个内网穿透。和AI配合&#xff0c;还是得自己思考&#xff0c;AI配合才能搞定&#xff0c;不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899&#xff0c;但是对于Gradio建立的服务器好像不行&#xff0c;会出…

Django 模型

Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、方法概述 CNN-BiLSTM-Attention多输入单输出回归预测方法旨在通过融合CNN的局…

动态库dll与静态库lib编程4:MFC规则DLL讲解

文章目录 前言一、说明二、具体实现2.1新建项目2.2 模块切换的演示 总结 前言 动态库dll与静态库lib编程4&#xff1a;MFC规则DLL讲解。 一、说明 1.前面介绍的均为Win32DLL&#xff0c;即不使用MFC的DLL。 2.MFC规则DLL的特点&#xff1a;DLL内部可以使用MFC类库、可以被其他…

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…

数据挖掘——回归算法

数据挖掘——回归算法 回归算法线性回归最小二乘法优化求解——梯度下降法逻辑回归逻辑回归函数逻辑回归参数估计逻辑回归正则化 决策树回归小结 回归算法 回归分析 如果把其中的一些因素&#xff08;房屋面积&#xff09;作为自变量&#xff0c;而另一些随自变量的变化而变化…

前端如何从入门进阶到高级

在前端学习的道路上&#xff0c;我们将其划分为三个阶段&#xff1a;入门、实战和进阶。以下是各阶段的学习指南 一、入门阶段 在入门阶段&#xff0c;我们的目标是掌握前端的基本语法和知识&#xff0c;以便能够独立解决一些基础问题。这一阶段&#xff0c;我们建议通过视频…

Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法

背景 Android14 CTS r6和GTS 12-r1之后&#xff0c;tf-console默认会带起OLC Server&#xff0c;看起来olc server可能是想适配ATS(android-test-station)&#xff0c;一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的&#xff0c;网页上简单配置下…

Linux中的tcpdump抓包命令详解:抓取TCP和UDP数据包并按小时输出文件

Linux中的tcpdump抓包命令详解:抓取TCP和UDP数据包并按小时输出文件 一、tcpdump简介二、安装tcpdump三、抓取TCP和UDP数据包四、按小时输出文件五、tcpdump命令的常用选项和表达式六、总结在Linux系统中,tcpdump是一款强大的网络抓包工具,它基于libpcap库开发,可以捕获网络…