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

标签 python subprocess xen bash

我是第一次在这里寻求一些帮助,因为我更像是一个 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/

相关文章:

python - 带有子进程模块的进程永远不会停止运行

python - 在 python 中,如何检查 subprocess.Popen 对象的标准输出是否有任何可读内容?

python - python subprocess.check_output 与 os.system 的问题

oop - 根据初始化参数更改实例化的类

python - 相当于 MATLAB 元胞数组的 Numpy

python - 以 Django 形式显示自定义消息

xen - 如何构建 Mirage OS 的 Xen unikernel

python - 挣扎于基本的数据帧操作(Python)

linux - 具有 arm64 架构的 QEMU 上的 Xen

linux - yum更新后Xen CentOS 6 VM无法启动-内核错误