在 python 中使用带有 linux 全局变量的 open() 问题

Issue using open() in python with a linux global variable

我试图在 python 中使用 open() 打开并读取文件,在 Linux 中使用全局变量 $USER,但程序在第 2 行停止。我想相信问题出在 open() 函数中,因为我在第 1 行中使用 $USER 并且一切正常:

os.system("/usr/bin/nmap {target} -oN /home/$USER/.nmap_diff/scan{today}.txt")
scantxt = open("/home/$USER/.nmap_diff/scan{today}.txt","rb")

输出为:

File "diffscanner.py", line 92, in scanner
  scantxt = open("/home/$USER/.nmap_diff/scan{}.txt".format(today),"rb")
FileNotFoundError: [Errno 2] No such file or directory: '/home/$USER/.nmap_diff/scan2021-07-10.txt'

输出说scan2021-07-10.txt没有找到,但确实存在: scan2021-07-10.txt

os.system 子 shell 中执行命令(作为字符串传递)。这意味着,该命令将可以访问 Linux 的环境变量,在您的情况下为 USER

另一方面,open 需要一个 path-like 对象,例如路径字符串。字符串按原样读取,不会计算以用实际值替换 USER(或任何其他环境变量)。如果要使用环境变量,请使用 os.environ

import os

USER = os.environ['USER']

scantxt = open(f"/home/{USER}/.nmap_diff/scan{today}.txt","rb")

问题是 $USERopen 解释为文字字符串,而不是环境变量。要在字符串中扩展环境变量,请使用 os.path.expandvars.

os.system(f"/usr/bin/nmap {target} -oN /home/$USER/.nmap_diff/scan{today}.txt")
result_path = os.path.expandvars(f"/home/$USER/.nmap_diff/scan{today}.txt")
with open(result_path, "r", encoding="utf-8") as f:
    scantxt = f.read()

顺便说一句,您问题中的字符串看起来也应该是 f-strings,但缺少 f 前缀。我已将它们添加到我的回答中。

此外,我假设您希望将扫描结果作为字符串,因此我也为此添加了代码。 (似乎 nmap 通常不会在 -oN 选项的输出中包含任何非 ascii 字符,但我将编码指定为 UTF-8,以防将来添加对 UTF-8 字符的支持版本。)