【问题标题】:How to use wildcards with Envoy如何在 Envoy 中使用通配符
【发布时间】:2012-02-24 18:06:33
【问题描述】:

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

【问题讨论】:

  • sqlite3 模块包含在 python 的标准库中。 docs.python.org/library/sqlite3.html 这样你就可以更直接地访问数据库中的数据了。
  • 谢谢 - 我同意,我主要使用 sqlalchemy。但我还必须运行相当多的 shell 命令,这些命令需要 subprocess、os.system、popen 或 envoy。我希望确认 Envoy 可以处理这些简单的命令。
  • 您可以将它们编写为单个脚本,然后使用多处理模块将它们分离出来。
  • 是的,这会使生成命令变得更加困难。我想要一些灵活性。这要求不高,人们经常使用 perl 或 python 使用 popen、os.system() 等来做到这一点。

标签: python python-envoy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以使用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
    

    【讨论】:

    • 谢谢 - 特使列表中的列表起到了作用。你能告诉我那里发生了什么吗?
    • @Buford Sweatley:我刚刚看过source。原始问题(字符串参数)似乎是envoy 中的一个错误。
    • 这可能是一个愚蠢的问题,但我尝试“r = envoy.run('rm /tmp/*')”但没有成功。 r.std_error 说:“没有这样的文件或目录”这是唯一或多或少相关的线程。这真的有关系吗?
    • @JoukeWaleson:subprocess.check_call(['rm']+glob.glob('/tmp/*')) 或更好:for path in glob.iglob('/tmp/*'): os.remove(path)。注意:如果/tmp/ 有子目录,两者都会失败。我猜envoy.run 默认情况下不会调用外壳程序,所以rm 从字面上看是/tmp/* 文件名。你可以ask the question,有人可能会提供更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2017-03-19
    • 2018-09-09
    相关资源
    最近更新 更多