【问题标题】:Difference between subprocess.call and os.system in python 3python 3中subprocess.call和os.system之间的区别
【发布时间】:2021-05-22 11:46:38
【问题描述】:

我编写了一个 python 3 脚本来测试 API。 API 只能通过服务器访问,因此我有一个 bash 脚本,可以通过 ssh 在该服务器上执行 wget 并将结果移动到我的本地计算机进行分析。该脚本单独运行良好。

现在我想从 python 调用这个 bash 脚本几次,但是当我使用 subprocess.call() 时,bash 脚本中的 ssh 命令似乎中断了。 此行应将 API 响应保存到我服务器上的选定位置,以便稍后将其复制到我的计算机:

ssh USER@SERVER.com "wget 'https://API.com/?${options}' -O '${file_path}'"                                                                                                    

但是我得到了错误bash: -O: command not found 并且响应被保存到wget 生成的默认文件中:

*Using options: 'filter[id]=1234'
*Sending request to API
bash: -O: command not found
--2021-02-19 12:02:52--  https://API.com/?filter[id]=1234

...

Saving to: ‘index.html?filter[id]=1234’

     0K .......... .......... ........                        100% 9.48M=0.003s

2021-02-19 12:02:52 (9.48 MB/s) - ‘index.html?filter[id]=1234.’ saved [29477/29477]                                                                                                                                                          

所以在我看来,通过 ssh 执行的命令以某种方式被拆分为多个命令?

奇怪的是,当我使用os.system() 执行脚本(或直接从终端调用)时,它可以完美运行。下面是调用 bash 脚本的 python 代码:

# Failing subprocess.call line
subprocess.call(["./get_api.sh", save_file_name, f"'filter[id]={id}'"])

# Succeeding os.system line
system(f"./get_api.sh {save_file_name} 'filter[id]={id}'") 

我想知道是否有人可以告诉我这里可能发生了什么?

(我对包含的代码进行了相当多的编辑以删除敏感信息,这也是我的第一个堆栈溢出问题,所以我希望它包含足够的信息/上下文)

【问题讨论】:

    标签: python ssh subprocess wget


    【解决方案1】:

    您在system 中使用的单引号不是查询的一部分;它们只是保护filter[id]={id} 免受shell 扩展的shell 命令的一部分。在使用不使用 shell 的 subprocess.call 时应省略它们。

    subprocess.call(["./get_api.sh", save_file_name, f"filter[id]={id}"])
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2017-04-03
      • 2011-06-16
      • 2013-09-15
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多