在 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")
问题是 $USER
被 open
解释为文字字符串,而不是环境变量。要在字符串中扩展环境变量,请使用 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 字符的支持版本。)
我试图在 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")
问题是 $USER
被 open
解释为文字字符串,而不是环境变量。要在字符串中扩展环境变量,请使用 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 字符的支持版本。)