在Python脚本中运行系统命令

4

我一直在学习Python语法和方法等相关知识,使用的是《Python简明教程》。

我刚刚开始尝试编写一个简单的备份脚本(直接从书中复制):

#!/usr/bin/python

# Filename: backup_ver1.py

import os

import time

# 1. The files and directories to be backed up are specified in a list.
source = ['"C:\\My Documents"', 'C:\\Code']

# Notice we had to use double quotes inside the string for names with spaces in it.
# 2. The backup must be stored in a main backup directory
target_dir = 'E:\\Backup' # Remember to change this to what you will be using

# 3. The files are backed up into a zip file.
# 4. The name of the zip archive is the current date and time
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'


# 5. We use the zip command to put the files in a zip archive
zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))


# Run the backup

if os.system(zip_command) == 0:
    print('Successful backup to', target)
else:
    print('Backup FAILED')

没错,它失败了。如果我在终端中运行zip命令,它可以正常工作。我认为它失败是因为实际上从未运行zip_command。而且我不知道如何运行它。

仅仅打出zip_command是行不通的。(我正在使用Python 3.1)


请记得格式化您的源代码。 - Jonathan Feinberg
请在粗体字母前面加上一个井号。抱歉。 - user208142
我还不知道格式... - user208142
我看到你添加了选项卡,谢谢。 - user208142
另外 - 对于一些愚蠢的问题我很抱歉,但我不知道你的了解程度 - 我猜你正在阅读针对版本3的《Python简明教程》?Python 2和3之间有相当多的差异。我不是在谈论这个具体的问题,而是针对你接下来的阅读 :-) - RedGlyph
显示剩余3条评论
4个回答

1

如果您能将代码格式化为代码,选择代码部分并单击编辑器工具栏中的“代码示例”按钮,这将有助于我们。该图标看起来像“101/010”,如果您将鼠标指针悬停在上面,则黄色的“工具提示”框会显示“代码示例<pre></pre> Ctrl+K”。

我刚试过了,如果您将代码粘贴到StackOverflow编辑器中,带有“#”的行将会加粗。因此,加粗的行是注释。目前为止还不错。

您的字符串似乎包含反斜杠字符。您需要将每个反斜杠都加倍,如下所示:

target_dir = 'E:\\Backup'

这是因为Python对反斜杠有特殊处理。它引入了“反斜杠转义”,使您可以在引号内放置引号:
single_quote = '\''

你也可以使用Python的“原始字符串”,它对反斜杠有更简单的规则。原始字符串由r"r'引入,并分别由"'终止。例如:

# both of these are legal
target_dir = r"E:\Backup"
target_dir = r'E:\Backup'

好的,我添加了反斜杠,但没有任何区别。 - user208142
让我引用这本书的话:然后,我们最终使用os.system函数运行命令,就好像它是从系统中运行的一样,即在shell中运行 - 如果命令成功,则返回0,否则返回错误号码。 - user208142

1

你确定 Python 脚本看到的环境和你在 shell 中手动输入命令时访问的环境相同吗?可能是当 Python 启动命令时 zip 不在路径上。


据我所见,它们在同一路径下。 - user208142

0
我建议的下一步是修改你的脚本以打印命令字符串,然后查看字符串是否正确。
另一件你可以尝试的事情是创建一个批处理文件来打印环境变量,并让Python运行它,看看环境是什么样子的。特别是PATH。
这里是一个建议的示例:
set
echo Trying to run zip...
zip

将它们放入名为C:\mytest.cmd的批处理文件中,然后让您的Python代码运行它:

result_code = os.system("C:\\mytest.cmd")
print('Result of running mytest was code', result_code)

如果它能正常工作,你会看到环境变量被打印出来,然后它会回显“尝试运行zip...”,如果zip运行成功,它将打印一个带有zip版本号和如何运行它的消息。

我已经完成了第一部分,并且它可以正常工作。所以zip_command是有效的。不过,我不知道如何完成第二部分。 - user208142
你对第二部分不理解的是什么?我来换一种说法:运行Windows记事本,复制上面的“建议示例”行(set、echo和zip行),然后将它们粘贴到记事本中。将文件保存为“C:\mytest.cmd”。然后运行所示的Python代码:result_code = os.system以及其余部分。 - steveha

0

zip命令只适用于Linux而不适用于Windows..这就是为什么它会出现错误的原因..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接