如何在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命令并不是简单的选择操作,不能仅仅通过SQLAlchemy轻松完成。
2 个回答
2
这在 envoy
中是行不通的,因为 envoy
会把命令拆分开,然后传给子进程。即使你尝试使用 subprocess.Popen(command, shell = False)
,最终你也会得到 sqlite3
的终端。无论是 subprocess
还是 envoy
都没有解决这个问题。如果你能在 envoy
上提个问题,我会很高兴,因为我正在为它贡献代码,我会考虑这个问题的。
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