我正在使用一个 Python 脚本,该脚本从 shell 脚本接收变量以通过 API 调用传输数据,第三个变量是提交消息。但是,当我尝试使用它时,它只打印字符串的第一个单词并停在下一个空格处。例:
"Testing this out"
变得"Testing"
.
我希望整个事情都传输。它是从第三个参数的 shell 脚本传输的,并且"3=Testing this out"
我有代码当前删除了3=
部分,但发生了上述问题。
这是我到目前为止所拥有的:
shell 脚本$1
、2
和3
是名为 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=}"