使用Python和subproces.call但在Bash工作

2024-06-17 14:49:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次在这里请求一些帮助,因为我更像是一个服务器故障的人。

我正在用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脚本执行它时,会出现一些奇怪的错误。我甚至换了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文档,并使用了以下代码:

^{pr2}$

可悲的是,这并没有改变任何东西。。。在


编辑2

我已经使用了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中运行这个命令时,这个命令可以正常工作。。。在


Tags: 代码image命令ip脚本错误createshell
3条回答

您(在大多数情况下)不希望将子进程与shell=True一起使用。 将参数列表传递给命令。那就是

  • 更安全:假设一个用户设法将foo; rm -rf /; echo作为一些值传递。在
  • {想象一下,{或者一个更可靠的shell}的内容将被一个更可靠的shell}所取代。在

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

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

在失败的Edit2示例中,您认为您给xen-create-image提供了以下选项:

  • --hostname
  • --memory
  • --partitions=...
  • 等等

。。。但您实际上指定了以下选项:

  • --hostname空格
  • 空格--memory空格
  • 空间--partitions=...
  • 等等

你有这样一句话:

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

但你需要去掉多余的空间:

^{pr2}$

xen-create-image脚本是否以hashbang开头?也就是说,第一行是不是有点像

#!/bin/sh

是吗?这是需要检查的一件事。另一种方法是,您可以尝试将命令调用为:

^{pr2}$

您可能需要打印cmd来验证这是您要运行的命令(即检查替换)。在

相关问题 更多 >