Ubuntu下用lpr打印Python临时文件报错:无法访问文件f的解决方法
解决Ubuntu下Python调用lpr打印临时文件报错的问题
错误原因
- 你的
os.system命令里的f是字符串字面量,不是变量f对应的临时文件路径,所以lpr会尝试读取名为f的文件,自然找不到。 tempfile.mktemp是已废弃的方法,存在安全风险(可能出现竞争条件,导致其他进程篡改文件)。
正确实现方式
方式1:修复变量替换问题(不推荐使用mktemp)
先将命令中的变量f正确代入,同时用完临时文件后手动删除:
import os import tempfile s = 'mystring' f = tempfile.mktemp('.txt') # 使用with语句确保文件正确关闭 with open(f, 'w') as fp: fp.write(s) # 用f-string将临时文件路径代入命令 os.system(f"lpr -P myprinter_name {f}") # 打印完成后删除临时文件 os.unlink(f)
方式2:使用安全的临时文件API(推荐)
用tempfile.NamedTemporaryFile替代mktemp,它是原子创建文件,避免安全问题,同时通过delete=False确保文件在关闭后仍存在(默认关闭即删除,lpr读取时需要文件存在):
import os import tempfile s = 'mystring' # 创建临时文件,suffix指定后缀,delete=False表示关闭后不自动删除 with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as fp: fp.write(s) temp_file_path = fp.name try: # 代入临时文件路径到打印命令 os.system(f"lpr -P myprinter_name {temp_file_path}") finally: # 无论打印成功与否,都清理临时文件 os.unlink(temp_file_path)
关键说明
- 必须确保命令中的临时文件路径是变量的实际值,而不是字符串中的
f字符,用f-string或str.format()都可以实现变量替换。 - 优先使用
NamedTemporaryFile,它比mktemp更安全,能避免因竞争条件导致的文件安全问题。 - 使用
with语句管理文件对象,确保文件正确关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者nix20536
相关产品推荐
相关产品推荐

