如何使用Envoy的通配符

时间:2012-02-02 02:28:59

标签: python python-envoy

我正试图通过KennethReitz的Envoy包运行这个命令:

$ sqlite3 foo.db 'select * from sqlite_master' 

我试过这个:

r = envoy.run("sqlite3 foo.db 'select * from sqlite_master'")
sqlite3: Error: too many options: "*"

和此:

r = envoy.run(['sqlite3', 'foo.db', 'select * from sqlite_master'])
AttributeError: 'NoneType' object has no attribute 'returncode'

额外报价&逃避似乎没有帮助。有什么建议吗?

仅供参考:这就是我现在必须做的事情:

cmd = "sqlite3 %(database)s 'select * from sqlite_master'" % locals()
os.system(cmd)

请注意,这是一个人为的例子,我想发出的大多数unix shell命令不仅仅是一个可以通过SQLAlchemy轻松完成的简单选择。

2 个答案:

答案 0 :(得分:2)

这在envoy中不起作用,因为envoy会拆分命令并将它们传递给子进程。即使您尝试使用subprocess.Popen(command, shell = False),您最终也会获得sqlite3终端。 subprocessenvoy都未能解决这个问题,如果您能在envoy中解决问题,我会很高兴,因为我正在为此做出贡献,我会考虑这个问题。

答案 1 :(得分:1)

您可以使用subprocess

from subprocess import check_output as qx

output = qx(['sqlite3', 'foo.db', 'select * from sqlite_master'])
print output

sqlite3模块:

import sqlite3

conn = sqlite3.connect('foo.db')
for row in conn.execute('select * from sqlite_master'):
    print row

如果您仍想使用envoy,则可以将其修改为:

import envoy

r = envoy.run([["sqlite3", "foo.db", "select * from sqlite_master"]])
print r.std_out