python子流程.Popen()synax错误

2024-04-27 02:42:53 发布

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

我正在尝试使用镜像以下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()出错了?你知道吗


Tags: fromecho镜像stdoutline流程whereselect
2条回答

问题是您试图在没有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 arg2shell管道的模拟形式是:

from subprocess import Popen, PIPE

p = Popen(["command", "arg1", "arg2"], stdin=PIPE)
p.communicate("some string")

在您的情况下,您可以将其写为:

import shlex
import sys
from subprocess import Popen, PIPE

cmd = shlex.split("bsqldb -S mdw2k8sqlp02.dow.com -D PhoneBookClient "
                  "-U PortManUser -P plum45\\torts -q")
sql = """SELECT employeeid FROM Users
         WHERE samaccountname={name};""".format(name=sql_escape(sys.argv[1]))
p = Popen(cmd, stdin=PIPE)
p.communicate(input=sql)
sys.exit(p.returncode)

相关问题 更多 >