Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带引号和变量的Python子流程命令_Python_Subprocess - Fatal编程技术网

带引号和变量的Python子流程命令

带引号和变量的Python子流程命令,python,subprocess,Python,Subprocess,我有一个复杂的命令,我想与子进程一起运行。它包含单引号和双引号,我想加入一些变量 这是字符串: gitlab create_merge_request 5 "{} - New merge request - {}" "{source_branch: '{}', target_branch: 'dev', assignee_id: 1}" --json 我想在“New merge request”部分(它包含两个变量和“source_branch”变量)周围保留引号。“source_branc

我有一个复杂的命令,我想与子进程一起运行。它包含单引号和双引号,我想加入一些变量

这是字符串:

gitlab create_merge_request 5 "{} - New merge request - {}" "{source_branch: '{}', target_branch: 'dev', assignee_id: 1}"  --json
我想在“New merge request”部分(它包含两个变量和“source_branch”变量)周围保留引号。“source_branch”部分中的大括号也会导致问题

当我像这样格式化字符串时:

gitLabCreateMerge = ('/usr/local/bin/gitlab create_merge_request 5 ', str(committerUser), ' requested - Automated Merge Request- ', str(reviewerUser), "'{source_branch:", str(branchName), " target_branch: 'dev', assignee_id: 1}' --json")
('/usr/local/bin/gitlab create_merge_request 5 ', 'alice', ' requested - Automated merge request - joe ', "'{source_branch:", 'testdevbranch', " target_branch: 'dev', assignee_id: 1}' --json")
看起来是这样的:

gitLabCreateMerge = ('/usr/local/bin/gitlab create_merge_request 5 ', str(committerUser), ' requested - Automated Merge Request- ', str(reviewerUser), "'{source_branch:", str(branchName), " target_branch: 'dev', assignee_id: 1}' --json")
('/usr/local/bin/gitlab create_merge_request 5 ', 'alice', ' requested - Automated merge request - joe ', "'{source_branch:", 'testdevbranch', " target_branch: 'dev', assignee_id: 1}' --json")

对于子流程,您最好传递一个字符串列表,而不是由shell计算的字符串。这样您就不必担心平衡双引号(以及转义可能的可执行值)

卷曲大括号可以通过将其加倍来调整

考虑到这两个注意事项,我可以这样做:

committerUser = 'alice'
reviewerUser = 'joe'
branchName = 'testdevbranch'
cmd = ["gitlab",
    "create_merge_request",
    "5",
    f"{committerUser} - New merge request - {reviewerUser}",
    f"{{source_branch: '{branchName}', target_branch: 'dev', assignee_id: 1}}",
    "--json"]
subprocess.Popen(cmd, …)
我在这里使用的是Python 3.6,但也可以使用
str.format()
方法

"{} - New merge request - {}".format(committerUser, reviewerUser),
"{{source_branch: '{}', target_branch: 'dev', assignee_id: 1}}".format(branchName),
或者显式地通过连接,这可能比试图记住双大括号的用途更容易理解

committerUser + " - New merge request - " + reviewerUser,
"{source_branch: '" + branchName + "', target_branch: 'dev', assignee_id: 1}",

请您使用比asdfasd更独特的值,这将使问题更容易阅读。例如,在问题中写入
committerUser='alice'
。这很公平。我已修改了最后一个blob。感谢您的回答。其中一行(格式错误)出现错误:f“{committerUser}-新合并请求-{reviewerUser}',^SyntaxError:syntaxSubbing无效为您的str.format()行输出两个f字符串行。成功了。谢谢!