gpt4 book ai didi

python - 使用 Python 和 subprocces.call 执行脚本的问题在 Bash 中仍然有效

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:56 25 4
gpt4 key购买 nike

我是第一次在这里寻求一些帮助,因为我更像是一个 ServerFault 的人。

我正在用 Python 编写一些脚本,到目前为止我一直很喜欢这门语言,但我遇到了一个小问题,它使我的脚本无法正常工作。

这是有问题的代码行:

subprocess.call('xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd',shell=True)

我用 os.popen 尝试过同样的事情。所有变量均已正确设置。

当我在我的常规 Linux shell 中执行有问题的命令时,它工作得很好,但是当我使用我的 Python 脚本执行它时,我得到了奇怪的错误。我什至用 print 函数替换了 subprocess.call() 以确保我使用的是命令的准确输出。

我查看了我的 shell 的环境变量,但它们几乎相同......我将发布我遇到的错误,但我不确定它是否与我的问题相关。

Use of uninitialized value $lines[0] in substitution (s///) at /usr/share/perl5/Config/IniFiles.pm line 614. Use of uninitialized value $_ in pattern match (m//) at /usr/share/perl5/Config/IniFiles.pm line 628.

我不是 Python 专家,所以我很可能在这里遗漏了一些东西。

预先感谢您的帮助,

安托万


编辑

听从 miax 的建议,我停止使用 shell=True。相反,我查看了 subprocess 的 Python 文档并使用了以下代码:

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd'
args = shlex.split(cmd)
subprocess.call(args)

遗憾的是,它并没有改变任何东西......


EDIT2

我已经使用miax给出的提示,但我仍然得到上述错误...这是我使用的代码。

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd']
subprocess.call(cmd)

这真的很奇怪...当我在常规 shell 中运行时,确切的命令工作正常...

最佳答案

您(在大多数情况下)不想使用 shell=True 的子进程。将参数列表传递给命令。也就是

  • 更安全:假设用户设法通过 foo; rm -rf/; echo 作为一些值。
  • 更可靠:假设其中一个字符串包含 $ 或其他内容——它将被 shell 扩展并替换为该环境变量的内容。

在不知道您的代码和 xen-create-image 的情况下,我认为这是您问题的原因。

PS:务必查看命令的退出代码是否为零,如果不是,则采取适当的措施。 (如果您确定它将始终为零,请使用 check_call,如果它不为零,则它会引发;这样,如果它失败,您至少会有一个定义的行为。)

关于python - 使用 Python 和 subprocces.call 执行脚本的问题在 Bash 中仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com