如何将 shell 脚本中的*整个*句子插入 python 脚本?



我正在使用一个 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

蟒蛇代码:

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))

嗯。

不久前,我做了一个简单的脚本来接收数据。

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

是这样的:

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

对我来说,它确实可以接收完整的外壳输出

你可以像这样连接从数字 3 到末尾的所有参数

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

或者干脆你可以用引号传递提交消息

python pgm.py arg1 arg2 'commit message'

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

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

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=}"

最新更新