2

我正在尝试通过 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 轻松完成的简单选择。

4

2 回答 2

2

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

于 2012-02-02T06:17:41.080 回答
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
于 2012-02-02T08:23:50.643 回答