Linux服务运行Python程序无法生成CSV文件求助
问题原因及解决办法
1. 相对路径导致文件生成位置不符
Linux服务默认工作目录通常不是你的Python脚本所在目录,使用相对路径'file.csv'时,文件可能被创建在系统默认目录(如/或/var/lib/systemd/system/),而非你预期的位置。
解决办法:使用绝对路径指定CSV文件位置,可通过脚本自身路径拼接:
import os # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) csv_file_path = os.path.join(script_dir, 'file.csv') with open(csv_file_path, mode='w', newline='') as csv_file: # 后续代码保持不变
2. 服务运行用户无写入权限
Linux服务一般以特定用户(如root、www-data或自定义服务用户)运行,若该用户对CSV文件目标目录无写入权限,会导致文件无法创建。
解决办法:
- 确认服务运行用户:以systemd服务为例,查看服务配置文件中的
User字段。 - 为目标目录设置正确权限:
# 示例:创建日志目录并赋予服务用户权限 sudo mkdir -p /var/log/connection_logs sudo chown your_service_user:your_service_user /var/log/connection_logs sudo chmod 755 /var/log/connection_logs
- 将CSV文件路径指向该有权限的目录。
3. 文件缓冲区未及时刷新
Python文件对象默认使用缓冲机制,在持续运行的服务中,写入的数据可能暂存于内存缓冲区,未立即写入磁盘,导致看起来文件未生成。
解决办法:
- 打开文件时启用行缓冲:
with open(csv_file_path, mode='w', newline='', buffering=1) as csv_file: # 后续代码不变
- 或在每次写入后手动刷新缓冲区:
writer.writerow({'Timestamp': time, 'IP Address': client_address[0], 'Port': client_address[1]}) csv_file.flush() # 强制将缓冲区数据写入磁盘
额外优化:时间戳错误
你的代码中time变量在循环外定义,所有连接记录的时间均为程序启动时间,而非连接到达时间。建议将时间戳生成移至循环内部:
while True: client_socket, client_address = server_socket.accept() # 每次连接时生成当前时间 current_time = datetime.datetime.now().strftime('%y-%m-%d %H:%M:%S') print('IP: ',client_address[0], 'Porta: ', client_address[1], 'Data: ', current_time) writer.writerow({'Timestamp': current_time, 'IP Address': client_address[0], 'Port': client_address[1]}) client_socket.close()
内容的提问来源于stack exchange,提问作者Artur Borbely
相关产品推荐
相关产品推荐

