【问题标题】:How to pass string to shell script [duplicate]如何将字符串传递给shell脚本[重复]
【发布时间】:2019-06-11 19:07:58
【问题描述】:

我的任务是将我的 python 代码与 C++ 代码(称为streamer)连接起来,然后将结果返回给 python 脚本。我必须向 C++ 代码发送两个参数。第一个只是整数(这里没问题),但第二个是一个长字符串,您可以在此处看到。

8 0
37 0
81 0
95 0
116 0
133 0
145 0
184 0
207 0
223 0
258 0
277 0

在 C++ 代码中,我只是使用此代码打印两个参数以查看我传递的内容:

std::cout << "ARGUMENT 1: " << argv[1] <<'\n';
std::cout << "ARGUMENT 2: " << argv[2] <<'\n';

我尝试了几种我在这里找到的方法,但没有任何效果。当我尝试这个 python 代码时,它不会将第二个参数(长字符串)视为一个字符串,而是将其视为多个参数。

p = subprocess.Popen([r'./Solver/solver.sh', str(3), long_string], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
solver_result, err = p.communicate()

print(solver_result)
print(err)

我尝试过的另一种方法是在这里。这次它只打印第一个参数并且它崩溃并出现错误代码139 这很可能是因为没有argv[2]

p = subprocess.run([r'./Solver/solver.sh', str(3)], stdout=PIPE, input=long_string, encoding='ascii')
print(p.returncode)
print(p.stdout)

Shell 脚本

#!/usr/bin/env bash

./Solver/streamer $1 $2 

我做错了什么?

【问题讨论】:

  • long_string的值是多少?
  • 请注意,您的脚本需要引用其参数以确保它们被正确传递。 ./Solver/streamer "$1" "$2",或者更好,./Solver/streamer "$@" 将它们全部通过。没有引号,空字符串将消失并且根本不会生成任何参数; * 将为您当前目录中的每个文件生成一个参数; two words 将成为每个单词一个参数(使用默认 IFS)等。
  • 顺便说一句,如果您在此处询问之前通过shellcheck.net 运行您的代码,它会将您链接到SC2086

标签: python shell subprocess


【解决方案1】:

这是您的 shell 脚本中的错误,而不是您的 Python 中的错误。

引用您的论点以防止它们被分词,然后将每个单词单独处理为一个整体:

#!/usr/bin/env bash
./Solver/streamer "$1" "$2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2021-04-16
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多