我正试图通过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轻松完成的简单选择。
答案 0 :(得分:2)
这在envoy
中不起作用,因为envoy会拆分命令并将它们传递给子进程。即使您尝试使用subprocess.Popen(command, shell = False)
,您最终也会获得sqlite3
终端。 subprocess
和envoy
都未能解决这个问题,如果您能在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