在Python脚本中输入逗号分隔的值
我是新手,因此提供了我所有的信息,下面的脚本从GitLab获取项目id并自动合并它。然而,这个脚本是以这样一种方式制作的,它接受在Python脚本中输入逗号分隔的值,python,arrays,python-3.x,list,gitlab,Python,Arrays,Python 3.x,List,Gitlab,我是新手,因此提供了我所有的信息,下面的脚本从GitLab获取项目id并自动合并它。然而,这个脚本是以这样一种方式制作的,它接受 ./mergeMR --projectid 1 我想要的是,它应该输入多个项目ID,通过逗号分隔,如下所示: ./mergeMR --projectid 1,11,21 我有点困惑如何实现这一点,以及我需要在脚本中进行哪些更改,以使其高效运行 mergeMR.py脚本是: import requests import json import argparse im
./mergeMR --projectid 1
我想要的是,它应该输入多个项目ID,通过逗号分隔,如下所示:
./mergeMR --projectid 1,11,21
我有点困惑如何实现这一点,以及我需要在脚本中进行哪些更改,以使其高效运行
mergeMR.py脚本是:
import requests
import json
import argparse
import sys
import os
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
baseprojecturl='https://xxxxx.com/api/v4/projects/'
headers={'PRIVATE-TOKEN': 'xxxxxxxxxxxxxxxxxxx'}
def conflictsMR(project_id,mr_id):
url=baseprojecturl+str(project_id)+'/merge_requests/'+str(mr_id)
try:
response = requests.get(url,headers=headers,verify=False)
statuscode=response.status_code
if(statuscode==200):
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
return json_response['has_conflicts']
except:
print("An exception occurred")
def checkMR(project_id,mr_id):
url=baseprojecturl+str(project_id)+'/merge_requests/'+str(mr_id)
try:
response = requests.get(url,headers=headers,verify=False)
statuscode=response.status_code
if(statuscode==200):
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
sourcebranch=json_response["source_branch"]
targetbranch=json_response["target_branch"]
return (sourcebranch,targetbranch)
else:
print("Invalid Merge Request ID: "+str(mr_id))
except:
print("An exception occurred")
def getMRPipelineStatus(project_id,mr_id):
url=baseprojecturl+project_id+'/merge_requests/'+str(mr_id)
try:
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
if(json_response['head_pipeline']['status']=='success'):
return True
else:
return False
except:
print("An exception occurred: getMRPipelineStatus for MR#"+str(mr_id))
def listMRDiscussions(project_id,mr_id):
url=baseprojecturl+project_id+'/merge_requests/'+mr_id+'/discussions'
try:
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
print(json_response)
except:
print("An exception occurred")
def line(char):
print(char*50)
def approveMR(project_id,mr_id,status,comment):
url=baseprojecturl+project_id+'/merge_requests/'+mr_id+'/approve'
try:
response = requests.post(url,headers=headers,verify=False)
json_response = response.json()
print(json_response)
except:
print("An exception occurred")
def mergeMR(project_id,mr_id):
url=baseprojecturl+project_id+'/merge_requests/'+str(mr_id)+'/merge'
try:
response = requests.put(url,headers=headers,verify=False)
if(response.status_code==200):
return True
else:
return False
except:
print("An exception occurred")
def validatePRID(project_id):
url=baseprojecturl+project_id
try:
response = requests.get(url,headers=headers,verify=False)
if(response.status_code==200):
return True
else:
return False
except:
print("An exception occurred")
def listMR(project_id):
url=baseprojecturl+project_id+'/merge_requests'
params={'state': 'opened'}
try:
response = requests.get(url,headers=headers,params=params,verify=False)
dict_as_json = str(response.text)
json_array=json.loads(str(dict_as_json))
mrs=[]
for item in json_array:
mrid=item['iid']
mrs.append(mrid)
return mrs
except:
print("An exception occurred")
def getApprovalStatus(project_id,mr_id):
url=baseprojecturl+project_id+'/merge_requests/'+str(mr_id)+'/approvals'
try:
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
print("Total No.of approvals left: "+str(json_response["approvals_left"]))
if(json_response["approvals_left"]==0):
if(listMRApprovers(project_id,mr_id)):
return True
else:
print("return false here")
return False
else:
return False
except:
print("Exception occurred during getApprovalStatus")
def createBranch(project_id,dest_branch,source_branch):
url=baseprojecturl+project_id+'/repository/branches'
params={'branch': dest_branch,'ref':source_branch}
try:
response = requests.post(url,headers=headers,params=params,verify=False)
if(response.status_code==201):
return True
else:
return False
except:
print("Exception occurred during createBranch")
def deleteBranch(project_id,branch):
url=baseprojecturl+project_id+'/repository/branches'
try:
url=baseprojecturl+project_id+'/repository/branches/'+branch
response = requests.delete(url,headers=headers,verify=False)
if(response.status_code==204):
return True
else:
return False
except:
print("Exception occurred during deleteBranch")
def checkBranch(project_id,branch):
url=baseprojecturl+project_id+'/repository/branches/'+branch
try:
response = requests.get(url,headers=headers,verify=False)
if(response.status_code==200):
return True
else:
return False
except:
print("Exception occurred")
def listMRApprovers(project_id,mr_id):
url=baseprojecturl+project_id+'/merge_requests/'+str(mr_id)+'/approval_state'
try:
response = requests.get(url,headers=headers,verify=False)
json_response = response.json()
no_of_rules=len(json_response["rules"])
total_no_of_approvals=0
no_of_approved=0
sanity=False
rule_names=[]
for rule in range(no_of_rules):
rule_names.append(json_response["rules"][rule]["name"])
if("sanity approval" not in rule_names):
sanity=True
for rule in range(no_of_rules):
if(not str(json_response["rules"][rule]["name"])=="sanity approval"):
total_no_of_approvals=total_no_of_approvals+int(json_response["rules"][rule]["approvals_required"])
for rule in range(no_of_rules):
if(json_response["rules"][rule]["approved"]):
if(str(json_response["rules"][rule]["name"])=="sanity approval"):
sanity=True
else:
no_of_approved=len(json_response["rules"][rule]["approved_by"])
else:
ary=str(json_response["rules"][rule]["approved_by"])
if(ary=='[]'):
return False
return True
except:
print("An exception occurred during listMRApprovers")
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--projectid', action='store', type=str, required=True)
args = parser.parse_args()
project_id=args.projectid.strip()
line('=')
if(validatePRID(project_id)):
print("Project ID validation: SUCCESS")
mrlist=listMR(project_id)
if(mrlist):
for mr in mrlist:
line('-')
print("Processing MR:"+str(mr))
if(not conflictsMR(project_id,mr)):
if(getMRPipelineStatus(project_id,mr)):
print("Status of Pipeline for MR#"+str(mr)+" is SUCCESS")
if(getApprovalStatus(project_id,mr)):
if(mergeMR(project_id,mr)):
source_branch,target_branch=checkMR(project_id,mr)
if(checkBranch(project_id,source_branch)):
if(createBranch(project_id,"tobedeleted_"+source_branch,source_branch)):
if(deleteBranch(project_id,source_branch)):
print("Branch Renaming: SUCCESS")
else:
print("Branch Deletion: FAIL")
else:
print("Branch Creation: FAIL")
else:
print("Branch already removed")
else:
print("Error Merging MR")
else:
print("Approval criteria not met for MR#"+str(mr)+", can't be merged")
else:
print("Status of Pipeline for MR#"+str(mr)+": FAIL")
else:
print("Conflicts for MR#"+str(mr)+" can't be merged")
else:
print("There are no MRs meeting the criteria")
else:
print("Project ID validation: FAIL")
line('=')
if __name__ == "__main__":
main()
我试图通过拆分函数来实现这一点,但可能我做错了
其主要目的是,它不应该使用不同的项目ID多次运行此脚本,而应该在对指定的项目ID(以逗号表示)仅运行一次之后完成此任务
提前谢谢。如果你需要什么,请添加评论,我会帮助你
编辑部分
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--projectid', action='store', type=str, required=True)
args = parser.parse_args()
project_id=args.projectid.strip().split(',')
for project_id in project_ids:
process(project_id)
def process(projectid):
line('=')
if(validatePRID(project_id)):
print("Project ID validation: SUCCESS")
mrlist=listMR(project_id)
if(mrlist):
for mr in mrlist:
line('-')
print("Processing MR:"+str(mr))
if(not conflictsMR(project_id,mr)):
if(getMRPipelineStatus(project_id,mr)):
print("Status of Pipeline for MR#"+str(mr)+" is SUCCESS")
if(getApprovalStatus(project_id,mr)):
if(mergeMR(project_id,mr)):
source_branch,target_branch=checkMR(project_id,mr)
if(checkBranch(project_id,source_branch)):
if(createBranch(project_id,"tobedeleted_"+source_branch,source_branch)):
if(deleteBranch(project_id,source_branch)):
print("Branch Renaming: SUCCESS")
else:
print("Branch Deletion: FAIL")
else:
print("Branch Creation: FAIL")
else:
print("Branch already removed")
else:
print("Error Merging MR")
else:
print("Approval criteria not met for MR#"+str(mr)+", can't be merged")
else:
print("Status of Pipeline for MR#"+str(mr)+": FAIL")
else:
print("Conflicts for MR#"+str(mr)+" can't be merged")
else:
print("There are no MRs meeting the criteria")
else:
print("Project ID validation: FAIL")
line('=')
if __name__ == "__main__":
main()
我已经编辑了上面的部分,但似乎仍然没有达到它的目标。
我做错了什么吗?将项目提取为列表很容易(顺便说一句,建议您使用与参数相同的变量名以避免混淆): 现在,您必须将其与程序的其余部分集成,以便调用者接受列表或遍历列表,并在循环中一次处理一个列表:
project_ids = args.projectid.strip().split(',')
for project_id in project_ids:
...
我们讨论了将所有代码移动到函数:
def process(projectid):
# cut & paste everything from def main() starting from line('=') to the last line('=')
然后集成我上面提到的更改,以便只需阅读:
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--projectid', action='store', type=str, required=True)
args = parser.parse_args()
project_ids = args.projectid.strip().split(',')
for project_id in project_ids:
process(project_id)
这是很多代码,其中大部分与问题没有直接关系。你能试着把它缩小到一个范围吗?为了帮助你减少代码:你的程序从底部开始,调用
defmain()
。从那里,我们看到正在调用库argparse
。我找到了它的文档:我链接到了nargs
,它将允许您指定projectid
参数的多重性。这是您真正需要显示的唯一代码:parser=argparse.ArgumentParser()
parser.add_参数('--projectd',action='store',type=str,required=True)
args=parser.parse_args()
^与更好的拆分建议相比,这项工作要多一些。我主要是提供我的思考过程,我将如何框架这个问题。非常感谢您的回答!!我需要在哪里添加这段代码@Allan?可以指定吗?如果使用循环方法,请用这两行替换行project\u id=args.projectid.strip()
,并将所有内容缩进一级。我不知道如果你的代码中有任何一个保持你必须处理的状态。另一种方法是将第行('=')之后的所有代码提取到一个函数中,然后使用每个项目id调用该函数。哪种方法比较简单?例如,您的意思是我需要缩进第(=)行下面的所有代码?在加上以上两行之后?我会提取到一个函数中。你能告诉我怎样才能实现@Allan吗?我是新手,不知道该如何处理。
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--projectid', action='store', type=str, required=True)
args = parser.parse_args()
project_ids = args.projectid.strip().split(',')
for project_id in project_ids:
process(project_id)