后台运行 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.rhkb.cn/news/502893.html

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

相关文章

谷歌浏览器的书签同步功能详解

谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了众多强大的功能来提升用户的上网体验。其中&#xff0c;书签同步功能允许用户在不同设备之间无缝地同步浏览器数据&#xff0c;如书签、历史记录、密码等。本文将详细解析谷歌浏览器的书签同步功能&#xff0c;教…

pip error: microsoft visual c++ 14.0 or greater is required

报错原因&#xff1a;软件包作者发布的是为编译的*.tar.gz包&#xff0c;我们安装的时候需要调用系统C编译器来进行编译安装&#xff0c;如果系统没有安装编译器或者编译器版本不对就会报这个错误。 解决方式一&#xff1a;安装编译器&#xff0c;但不需要安装完整的visual c …

Windows提示msvcp120.dll丢失怎么解决?Windows文件丢失的4种解决方法,教你修复msvcp120.dll文件

Windows提示msvcp120.dll丢失&#xff1f;别担心&#xff0c;这里有4种解决方法&#xff01; 作为软件开发领域的一名从业者&#xff0c;我经常遇到用户反馈关于Windows系统报错的问题&#xff0c;其中“msvcp120.dll丢失”是一个较为常见的错误。今天&#xff0c;我将为大家科…

ESP32-C3 AT WiFi AP 启 TCP Server 被动接收模式 + BLE 共存

TCP 被动接收模式&#xff0c;每次发的数据会先存到缓冲区&#xff0c;参见&#xff1a;ATCIPRECVTYPE 指令说明。 即每包数据不会实时报告 IPD 接收情况&#xff0c;如果需要查询缓冲区的数据&#xff0c;先用 ATCIPRECVLEN? 指令查询被动接收模式下套接字数据的长度 。获取…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…

pytest测试用例管理框架特点及常见语法和用法分享

一、pytest及其特点 1. 什么是pytest pytest 是一个功能强大且灵活的 Python 测试框架&#xff0c;也是目前最流行的测试框架&#xff0c;可以让我们很方便的编写和管理自动化测试用例&#xff0c;并提供丰富的插件来满足单元测试、集成测试、性能测试等各种测试需求。 2. p…

现代密码学期末重点(备考ing)

现代密码学期末重点&#xff0c;个人备考笔记哦 密码学概念四种密码学攻击方法什么是公钥密码&#xff1f;什么是对称密码&#xff1f;什么是无条件密码&#xff1f; 中国剩余定理&#xff08;必考&#xff09;什么是原根什么是阶 经典密码学密码体制什么是列置换&#xff1f; …

HarmonyOS:@Builder装饰器:自定义构建函数

一、前言 ArkUI提供了一种轻量的UI元素复用机制Builder&#xff0c;其内部UI结构固定&#xff0c;仅与使用方进行数据传递&#xff0c;开发者可以将重复使用的UI元素抽象成一个方法&#xff0c;在build方法里调用。 为了简化语言&#xff0c;我们将Builder装饰的函数也称为“自…

VISRAG论文介绍:一种直接的视觉RAG

今天给大家介绍一篇论文&#xff0c;VISRAG: VISION-BASED RETRIEVAL-AUGMENTED GENERATION ON MULTI-MODALITY DOCUMENTS [pdf]&#xff0c;一种直接的视觉RAG。 Source&#xff08;来源&#xff09;:ICLR2025 Summary: &#xff08;文献方向归纳 &#xff09;多模态RAG Mot…

在 .Net 8.0 中使用 AJAX 在 ASP.NET Core MVC 中上传文件

上传文件是现代 Web 应用程序中的常见要求。在 ASP.NET Core MVC 中&#xff0c;高效处理文件上传可以提高应用程序的可用性和性能。在本文中&#xff0c;我们将探讨如何使用 AJAX 在 ASP.NET Core MVC 应用程序中实现文件上传&#xff0c;通过允许文件上传而无需刷新整个页面&…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE&#xff0c;对应的tomcat版本为9.0.41&#xff0c;公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应&#xff0c;从而可能导致获取其他用户先前请求的数据&#xff0c;造…

linux系统(ubuntu,uos等)连接鸿蒙next(mate60)设备

以前在linux上是用adb连接&#xff0c;现在升级 到了鸿蒙next&#xff0c;adb就不好用了。得用Hdc来了&#xff0c;在windows上安装了hisuit用的好好的&#xff0c;但是到了linux(ubuntu2204)下载安装了 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生…

C++:位与运算符

& 一&#xff0c;位与运算符的运算规则 有0则0。 二&#xff0c;判断奇偶性 %&#xff1a;优先级高&#xff0c;效率低 &&#xff1a;优先级低&#xff0c;效率高 数与1的位与运算结果为1则为奇数&#xff0c;结果为0则为偶数 三&#xff0c;获取一个数二进制的后…

(已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型

在雷达相机融合三维目标检测中&#xff0c;雷达点云稀疏、噪声较大&#xff0c;在相机雷达融合过程中提出了很多挑战。为了解决这个问题&#xff0c;我们引入了一种新的基于query的检测方法 Radar-Camera Transformer (RCTrans)。具体来说&#xff1a; 首先设计了一个雷达稠密…

如何利用PHP爬虫按关键字搜索淘宝商品

在当今的电商时代&#xff0c;获取淘宝商品信息对于市场研究、价格监控和竞争分析等方面具有重要意义。手动搜索和整理大量商品信息不仅耗时耗力&#xff0c;而且容易出错。幸运的是&#xff0c;PHP爬虫技术为我们提供了一种高效、自动化的方式来按关键字搜索淘宝商品。本文将详…

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

ceph集群配置

4台机器 高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提供高性能&#xff0c;高可靠性和高可用的对象存储&#xff0c;块存储&#xff0c;文件系统的存储。 使用分布式的算法保证数据的高可用和一致性。 ceph的架构&#xff1a; 1、ceph minitor MON&…

winform中使用panuon开源UI库的问题

在 WinForms 中使用 Panuon UI 是一种提高应用程序用户界面美观和交互性的方式。Panuon UI 是一个用于 .NET 应用程序的现代化 UI 库&#xff0c;它提供了一些非常好看的控件&#xff0c;能够让 WinForms 应用程序看起来更现代。 But------------------------------------&…

【Uniapp-Vue3】swiper滑块视图容器的用法

我们使用swiper标签就可以实现轮播图的效果。 一、swiper组件的结构 整体的轮播图使用swiper标签&#xff0c;轮播的每一页使用swiper-item标签。 <template><swiper class"swiper"><swiper-item><view class"swiper-item">111…

Which CAM is Better for Extracting Geographic Objects? A Perspective From参考文献

参考文献列表 [1] E. Shelhamer, J. Long, and T. Darrell, “Fully convolutional networks for semantic segmentation,” in Proc. Comput. Vis. Pattern Recognit., Jun. 2015, pp. 3431–3440. 中文翻译&#xff1a;[1] 谢尔哈默, E., 龙, J., & 达雷尔, T. (2015).…