【问题标题】:How to insert an *entire* sentence from a shell script into a python script?如何将shell脚本中的*整个*句子插入python脚本?
【发布时间】:2020-09-10 17:41:52
【问题描述】:

我正在使用一个 Python 脚本,它从 shell 脚本接收变量以通过 API 调用传输数据,第三个变量是提交消息。但是,当我尝试使用它时,它只打印字符串的第一个单词并在下一个空格处停止。示例:

"Testing this out" 变为 "Testing"

我想把整个东西都传送出去。它是从作为第三个参数的 shell 脚本传输的,并以 "3=Testing this out" 的形式出现。我有代码当前删除了 3= 部分,但发生了上述问题。

这是我目前所拥有的:

shell 脚本 $123 是一个名为 appworx 的程序在用户输入提示时所采用的提示:

python3 /RPS_files/script_deployment/Official_Gitlab.py $1 $2 $3

python代码:

import requests
import string
import json
import sys
from pathlib import Path

url = "hidden for privacy purposes"

headers = {
    "PRIVATE-TOKEN": "hidden for privacy purposes",
    "Content-Type": "application/json"
}

author = sys.argv[1]
author = author.replace("1=","")
filename = "/RPS_files/script_deployment_nz/" + sys.argv[2]
filename = filename.replace("2=","")
commit = sys.argv[3]
commit = commit.replace("3=","")
content = Path(filename).read_text()

sql_substring = ".sql"
loader_substring = ".ctl"
shell_substring = ".sh"

if sql_substring in filename:
    file_path = "New Testing Folder/NZ SQL Folder" + filename

elif loader_substring in filename:
    file_path = "New Testing Folder/NZ Loader Scripts Folder" + filename

elif shell_substring in filename:
    file_path = "New Testing Folder/NZ Shell Scripts" + filename


payload = {
               "id": "9081",
               "branch" : "master",
           "author_name": author,
           "author_email" : "N/A",
           "committer_name": author,
           "committer_email" : "N/A",
               "commit_message": commit,
               "actions": [

                   {
                   "action":"create",
               "file_path": file_path,
               "content": content
                   }
                   ]

               }

verify='/RPS_files/script_deployment/cacert.pem'
response = requests.post(url, headers=headers, data=json.dumps(payload), verify=verify)

pretty_json = json.loads(response.text)
print(json.dumps(pretty_json, indent=2))

【问题讨论】:

标签: python python-3.x linux bash shell


【解决方案1】:

嗯..

前段时间我做了一个简单的脚本来接收数据。

我使用了 os 模块中的 popen 函数。

是这样的吗:

stream = popen("command to run")
data = stream.read()

print(data)

对我来说,接收完整的 shell 输出很有效

【讨论】:

    【解决方案2】:

    你可以像这样用空格连接从数字 3 到结尾的所有参数

    commit = " ".join(sys.argv[3:])
    

    或者你可以简单地用引号传递提交信息

    python pgm.py arg1 arg2 'commit message'
    

    【讨论】:

      【解决方案3】:

      这里的问题是空格用于分隔提示符上的参数 - 并且在变量中包含空格。

      原因是变量在命令执行之前被替换,所以它有效地运行:

      python3 /RPS_files/script_deployment/Official_Gitlab.py arg1 arg2 Testing this out
      

      如您所见,$3 只是“测试”这个词 - 其余的是 $4 和 $5。

      如果你引用你的变量,shell 知道把它当作一个单独的参数,这就是你想要的。养成的一个好习惯是总是引用你的变量,除非你明确希望它以其他方式处理 - 这几乎总是永远不会(每当我这样做时,我都会留下评论解释原因,因为未来我很可能会引用它)。

      在这种情况下,我会跑步:

      python3 /RPS_files/script_deployment/Official_Gitlab.py "$1" "$2" "$3"
      

      引用它们的另一个原因 - 如果 $1 出于任何原因为空,则 $2 突然成为第一个参数,并且所有内容都向前移动了一个位置。但是,如果它在引号中,即使它是空的,它仍然会作为 "" 运行,因此至少保留了 的空性。

      作为奖励,您可以使用 bashes 前缀匹配功能来删除前导的“3=”(如果它同时存在):

      python3 /RPS_files/script_deployment/Official_Gitlab.py "${1#1=}" "${2#2=}" "${3#3=}"
      

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 2021-09-20
        • 2020-10-08
        相关资源
        最近更新 更多