我正在尝试使用镜像以下shell命令子流程.Popen():
echo "SELECT employeeid FROM Users WHERE samaccountname=${1};" | bsqldb -S mdw2k8sqlp02.dow.com -D PhoneBookClient -U PortManUser -P plum45\\torts -q
它现在看起来像:
stdout = subprocess.Popen(["echo", "\"SELECT", "employeeid", "FROM", "Users", "WHERE", "samaccountname=${1};\"", "|", "bsqldb", "arg1etc"], stdout=subprocess.PIPE)
for line in stdout.stdout.readlines():
print line
似乎这是错误的,它返回以下标准:
"SELECT employeeid FROM Users WHERE samaccountname=${1};" | bsqldb arg1etc
有人知道我的语法在哪里吗子流程.Popen()出错了?你知道吗
问题是您试图在没有shell的情况下运行shell命令。所发生的是,您正在传递所有这些字符串,包括
"|"
,后面的所有内容都作为echo
命令的参数。你知道吗只需将
shell=True
添加到您的调用中即可解决此问题。你知道吗但是,您几乎肯定希望将命令行作为字符串传递,而不是试图猜测将被连接到字符串中以传递给shell的列表。你知道吗
或者,最好不要使用shell,而是在Python中使用管道。文档中有一个关于Replacing shell pipeline(以及各种其他内容)的很好的部分,带有
subprocess
代码。你知道吗但是在您的例子中,您尝试管道化的只是
echo
,这是非常愚蠢的,因为您已经有了echo
将返回的内容,并且可以将其作为第二个程序的输入。你知道吗另外,我也不确定你希望
${1}
会被填充什么。假设您正在移植一个shell脚本,该脚本在命令行上使用了一些参数;您的Python脚本在sys.argv[1]
中可能也有相同的内容,但是如果您不了解更多关于您正在执行的操作的信息,这只不过是猜测而已。你知道吗Python中
echo some string | command arg1 arg2
shell管道的模拟形式是:在您的情况下,您可以将其写为:
相关问题 更多 >
编程相关推荐