Python 3.8:如何将变量传递给Windows CMD子进程?

问题描述

预先告白...我是一名蟒蛇新手。请原谅我的无知。

作为了解更多信息的一种方法,我正在尝试编写一个脚本,该脚本将使用最新的Quicken备份并使用7-Zip创建名称为带有时间戳的压缩和加密文件。然后,我想将其复制到两个两个位置。

我已经成功完成了名字部分。我在脚本启动时创建了一个变量,我想将此变量附加到基本文件名,但是我似乎无法做到这一点。当我尝试过时,脚本会运行,但是什么也没创建,也没有压缩文件。如果删除文件名变量有关的内容,则会得到预期的压缩和加密文件

这是我到目前为止所拥有的。我可以使用打印命令来确保正确完成了“ today”和“ newfile”变量。另外,我只用一个空的.docx文件进行测试,以便处理更快。

在此先感谢您提供任何/所有帮助或建议。我真的很感激。

from datetime import datetime
from pathlib import Path

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())


import subprocess
cmd= ['C:\\Program Files\\7-Zip\\7z.exe','a','-t7z','-mx9','"D:\\Quicken Backups\\Quicken2020\\" + newfile ".7z"','-ppassword','-mhe','D:\\Quicken Backups\\test.docx']
subprocess.Popen(cmd,stderr=subprocess.STDOUT,stdout=subprocess.PIPE)

解决方法

您是否考虑过使用像zipfile这样的用于压缩的python包?

这样,您无需处理打开子流程

BlockDeviceMappings[*].Ebs.VolumeSize

如果您不想使用这种方式,我会在您的代码中看到错误。

在新文件后您缺少一个+

import zipfile

dest_zip_folder = '2020_backup.zip'   # new file name
file_to_zip = 'D:\\Quicken Backups\\test.docx'
zipfile.ZipFile(dest_zip_folder,mode='w').write(file_to_zip)

也可以尝试subprocess.call()

cmd = [ ....,.... + newfile + '.7zip',... ]
,

花了很多时间来处理Windows变量语法,并以不同的方式运行子进程,但是我终于使事情正常了,在文件名中输出带有日期/时间戳的加密文件。

为进行故障排除,我在/ cmd命令中添加了/ K,以使该窗口在完成时不会关闭。这是在解决此问题方面的巨大帮助。

感谢所有看过我帖子的人。我希望有一天这个线程可以帮助其他人!

import os
from pathlib import Path

os.chdir('D:/Quicken Backups')
print(os.getcwd())

import subprocess
cmd = subprocess.Popen('cmd.exe /K ""C:\\Program Files\\7-Zip\\7z.exe" a -t7z -mx9 "D:\\Quicken Backups\\Quicken2020\\Q2020_%DATE:~4,2%-%DATE:~7,2%-%DATE:~-4%_%TIME:~0,2%%TIME:~3,2%%TIME:~8%.7z" -ppassword -mhe "D:\\Quicken Backups\\test.docx"')