在Python脚本中输入逗号分隔的值

在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

我是新手,因此提供了我所有的信息,下面的脚本从GitLab获取项目id并自动合并它。然而,这个脚本是以这样一种方式制作的,它接受

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