【问题标题】:SyntaxError: missing ; before statement - Python语法错误:缺少; before 语句 - Python
【发布时间】:2020-12-20 07:04:36
【问题描述】:

假设我有这个sn-p

list_command = 'mongo --host {host} --port {port} ' \
             '--username {username} --password {password} --authenticationDatabase {database} < {path}'


def shell_exec(cmd: str):
    import subprocess
    p = subprocess.call(cmd, shell=True)
    return p

假设这些是我试图在 mongo 上运行的命令

use users
show collections
db.base.find().pretty()

如果使用适当的值格式化字符串 list_command 并使用 shell=True 将其传递给函数,它可以正常工作。但出于安全目的,我试图避免它。 如果我用 shell=False 调用它,我会收到以下错误:

2020-08-31T14:08:49.291+0100 E QUERY [thread1] SyntaxError: missing ;声明之前@./mongo/user-01-09-2020:1:4 加载失败:./mongo/user-01-09-2020 253

【问题讨论】:

    标签: python python-3.x mongodb shell subprocess


    【解决方案1】:

    你的list_command 一个shell命令:特别是它包括输入重定向(通过&lt; {path}),这是shell的一个语法特性。要使用它,您需要 shell=True

    如果您不想使用shell=True,则需要更改构造参数的方式(单独的参数需要作为列表的单独项而不是作为单个字符串传递),并且您需要通过显式管道将脚本传递到标准输入,方法是设置其input 参数:

    cmd = ['mongo', '--host', '{host}', '--port', …]
    subprocess.run(cmd, input=mongodb_script)
    

    【讨论】:

    • 感谢您拯救了我的一天!
    【解决方案2】:

    使用输入引发了以下错误:TypeError: init() got an unexpected keyword argument 'input'

    我最终做了以下事情:

    import subprocess
    def shell_exec(cmd: str, stdin=None):
      with open(stdin, 'rb') as f:
          return subprocess.call(cmd.split(), stdin=f)
    

    【讨论】:

    • 我的错,你需要使用run而不是call
    • 您的代码可以通过将try 块替换为with 来简化。但是整个代码假定 MongoDB 脚本是由调用者写入文件的,除非这些文件实际上已经存在,否则我觉得这很不方便。变量p 也是不必要的;直接返回subprocess.call 的结果。而使用cmd.split() 几乎可以肯定是个坏主意。如果某个参数包含空格怎么办?最好不要一开始就将命令存储在单个字符串中,而是从一开始就使用列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2017-10-19
    • 2014-08-13
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多