如何在Envoy中使用通配符

2 投票
2 回答
718 浏览
提问于 2025-04-17 12:10

我正在尝试通过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

撰写回答