我正从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
我做错了什么?
答案 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}}是一个普通的函数而不是一种特殊的语句。但是否则,这仍然有效。)