Python 3.8如何向Windows CMD子进程传递变量?7-Zip压缩脚本问题
嘿,我看到你遇到的问题了——加入时间戳后脚本没生成压缩文件对吧?让我帮你排查一下代码里的几个关键点:
问题排查与修复方案
你的核心问题出在输出文件名的字符串拼接方式上,另外还有几个小细节需要调整,我一步步给你拆解:
1. 文件名拼接的致命错误
看你cmd列表里的这一段:
'"D:\\Quicken Backups\\Quicken2020\\" + newfile ".7z"'
你把Python变量newfile直接写在了字符串里,这会导致7-Zip把整个"D:\\Quicken Backups\\Quicken2020\\" + newfile ".7z"当作文件名,而不是把newfile的实际值替换进去。正确的做法应该用Python的字符串格式化来拼接路径和变量,比如用直观的f-string(Python 3.6+支持):
f"D:\\Quicken Backups\\Quicken2020\\{newfile}.7z"
或者用基础的字符串拼接:
"D:\\Quicken Backups\\Quicken2020\\" + newfile + ".7z"
另外,在subprocess的列表参数里,不需要给路径加额外的双引号——列表会帮你正确分割参数,引号是命令行里用来处理空格的,这里用列表传参就不用多此一举了。
2. 缺失的os模块导入
你的代码里用了os.chdir()和os.getcwd(),但没有导入os模块,虽然可能你实际写代码时漏了,但如果没加的话会直接报错,记得在开头补上:
import os
3. 等待子进程完成并捕获输出(可选但推荐)
用subprocess.Popen()启动进程后,脚本会直接往下走,可能进程还没完成脚本就结束了,而且你看不到7-Zip的错误信息。推荐改用subprocess.run()(Python 3.5+),它会等待进程完成,还能捕获输出帮你调试:
result = subprocess.run(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, text=True) print(result.stdout)
这样如果7-Zip有错误(比如路径不存在、文件名非法),你能直接看到输出,方便快速定位问题。
修复后的完整代码
把这些调整后,代码应该是这样的:
import os from datetime import datetime from pathlib import Path import subprocess today = datetime.now() print(today.strftime('%Y-%m-%d %H:%M:%S')) newfile = 'Q2020_' + today.strftime('%m-%d-%Y_%H%M%S') print(newfile) os.chdir('D:/Quicken Backups') print(os.getcwd()) # 正确拼接输出文件名 output_path = f"D:\\Quicken Backups\\Quicken2020\\{newfile}.7z" cmd = [ 'C:\\Program Files\\7-Zip\\7z.exe', 'a', '-t7z', '-mx9', output_path, '-ppassword', '-mhe', 'D:\\Quicken Backups\\test.docx' ] # 使用subprocess.run并捕获输出 result = subprocess.run(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, text=True) print("7-Zip输出:") print(result.stdout)
额外小建议
- 路径可以用
Path对象来处理,更简洁而且跨平台,比如:output_dir = Path("D:/Quicken Backups/Quicken2020") output_path = output_dir / f"{newfile}.7z" # 转成字符串传给cmd cmd = [..., str(output_path), ...] - 密码直接写在代码里不太安全,如果是个人使用还好,要是多人共享脚本的话,建议用环境变量或者输入框获取密码。
内容的提问来源于stack exchange,提问作者DrDistracto
相关产品推荐
相关产品推荐

