0

我正在尝试使用 subprocess.Popen() 镜像以下 shell 命令:

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

有谁知道我的 subprocess.Popen() 语法哪里出错了?

4

2 回答 2

1

问题是您试图在没有 shell 的情况下运行 shell 命令。发生的情况是,您将所有这些字符串(包括"|"其后的所有内容)作为参数传递给echo命令。

只需添加shell=True到您的通话中即可解决此问题。

但是,您几乎肯定希望将命令行作为字符串传递,而不是尝试猜测将连接回字符串以传递给 shell 的列表。

或者,更好的是,不要使用 shell,而是在 Python 中使用管道。文档中有一个很好的部分关于用代码替换 shell 管道(和各种其他东西)subprocess

但是在您的情况下,您尝试通过管道传输的东西是 just echo,这很愚蠢,因为您已经有了确切的echo返回值,并且可以将其作为输入提供给第二个程序。

另外,我不确定您希望${1}填写什么。大概你正在移植一个在命令行上接受一些参数的 shell 脚本;您的 Python 脚本可能在 中具有相同的内容sys.argv[1],但在不了解您在做什么的情况下,这只不过是猜测而已。

于 2013-08-29T21:09:52.990 回答
0

echo some string | command arg1 arg2Python中shell管道的类比是:

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)
于 2013-08-31T05:35:43.517 回答