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シェルコマンドのほとんどは、SQLAlchemyを介して簡単に実行できる単純な選択ではないことに注意してください。

4

2 に答える 2

2

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 に答える