TypeError:执行shell脚本时,不是在字符串格式化期间转换的所有参数?

时间:2014-11-19 21:27:40

标签: python bash shell subprocess

我正从Python脚本中推送shell脚本 -

import subprocess
proc = subprocess.Popen('#!/bin/bash\n\nulimit -n 8092\n\nulimit -a\n', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash')
(stdout, stderr) = proc.communicate()
if proc.returncode != 0:
    print "Hello, ABC! " % stderr;
    sleep(0.05) # delay for 50 ms
else:
    print "Hello, FGH! " % stdout;

但它总是给我错误信息 -

Traceback (most recent call last):
  File "test_python_1.sh", line 8, in <module>
    print "Hello, FGH! " % stdout;
TypeError: not all arguments converted during string formatting

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你做错了是误用string formatting operator

my_string % my_values背后的想法是Python通过my_string查找格式说明符,从%字符开始,并用以下值替换它们my_values。所以,当你这样做时:

"Hello, FGH! %s" % stdout

... %s将替换为stdout的值。同样,如果你这样做:

"Hello, ABC! %s\nHello, FGH! %n" % (stderr, stdout)

...第一个%s将替换为stderr,第二个stdout将替换为"Hello, FGH " % stdout 。但是当你这样做时:

%s

... 没有stdout或任何其他格式说明符,由stdout替换。这就是为什么它会抱怨&#34;并非所有参数都在字符串格式化过程中转换而且#34;:你有一个参数,stdout,但你的参数为零&#34;转换&# 34;通过格式说明符,所以剩下一个。

因此,如果您希望%s的值显示在空格之后,则需要在空格后放置"Hello, FGH %s" % stdout

print

然而,正如Padraic Cunningham指出的那样,你甚至不需要这里。您正在使用print statement,而print "Hello, FGH", stdout 可以使用多个参数并使用之间的空格打印出来。所以,你所需要的只是:

print

(如果/稍后你去Python 3.x,你需要在参数周围添加括号,因为{{1}}是一个普通的函数而不是一种特殊的语句。但是否则,这仍然有效。)