Python 将变量传递给子流程调用

Python 将变量传递给子流程调用,python,subprocess,Python,Subprocess,我正在尝试将变量从raw\u input传递到我的subprocess命令。我是Python新手。任何帮助他都将不胜感激 #!/usr/bin/python import subprocess print "\nWhat user name" username = str(raw_input('username: ')) print "\nWhat is the user id" userid = int(raw_input('Enter user id: ')) print "\nWhat

我正在尝试将变量从
raw\u input
传递到我的subprocess命令。我是Python新手。任何帮助他都将不胜感激

#!/usr/bin/python

import subprocess

print "\nWhat user name"
username = str(raw_input('username: '))
print "\nWhat is the user id"
userid = int(raw_input('Enter user id: '))
print "\nWhat is the user\'s primary group?"
primarygroup = int(raw_input('Enter group: '))
print "\nWhat is the user\'s secondary group?"
secondarygroup = int(raw_input('Enter group: '))

subprocess.call(['useradd' '-m' '-g' _primarygroup '-G' _secondarygroup '-u' _userid _username])

print"\nThe user has been added"

尝试用逗号分隔这些值:

subprocess.call(['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, '-u', _userid, _username])
请参阅-它接受一个数组,其中第一个参数是程序,所有其他参数都作为参数传递给程序


另外,不要忘记检查函数的返回值是否为零返回码,零返回码表示“成功”,除非用户添加是否成功与脚本无关。

尝试在列表项之间添加逗号:

subprocess.call(['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, \
                 '-u' ,_userid, _username])
subprocess.call
采用与以下参数相同的参数:

args
应该是字符串,或者是程序参数的序列


编辑

要同时将所有参数转换为字符串,可以使用列表:

args = ['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, \
        '-u' ,_userid, _username]
str_args = [ str(x) for x in args ]

列表
传递给
子流程.call

您可以先创建arg字符串,然后将此变量传递给subprocess.call。例如:

projects_csv_fn = 'projects_csv_2.csv'
prjects_json_fn = 'projects.json'

args ='python json_to_csv.py id ' + prjects_json_fn + ' ' + projects_csv_fn

subprocess.call(args, shell=True)
您是否尝试过使用“xxx{0}”。格式(变量)?


对我来说很好

你也可以使用f字符串

 import subprocess

 site = 'google.com'
 subprocess.run(['nslookup', f'{site}'])

你有什么问题?请具体一点。希望“具体一点”是n00bz更清楚地思考问题的一种方式。非常古老,但我会注意到,例如,主组已读入
主组
,但随后试图通过
\u primarygroup
访问。我正在尝试将原始输入中给定的值传递给我的子进程调用。不幸的是,\u primarygroup、\u secondarygroup和\u username的值必须是整数。IE:useradd-G501-503-U501也许你的问题出在外壳上。程序和脚本的参数只能作为字符串传递(例如,传递字符串“501”而不是整数501)。将这些字符串解析为正确的格式取决于被调用的进程。您可以在将参数传递给
call
之前将其转换为字符串;查看我的编辑。或者只查看
子流程。如果有人试图上载名为
$(rm-rf~).CSV的项目CSV,请检查调用(['useradd','-m','-g',str(_primarygroup),'-g',str(_secondarygroup),'-u',str str userid)]
,运行此代码意味着某人将度过非常糟糕的一天。如果
site
已经是一个字符串,那么将多个其他字符串粘在一起,以便shell需要再次将它们分开显然是浪费。
f'{site}
只是说
site
是一种愚蠢的方式。这是错误的
'-g'
和组名需要是单独的字符串,对于
'-g'
'-u'
也是如此。尝试
子流程。检查\u调用(['useradd'、'-m'、'-g'、\u primarygroup、
-g
、\u secondarygroup、'-u'、\u userid])
subprocess.run(['useradd', '-m', '-g {0}'.format(_primarygroup), '-G {0}'.format(_secondarygroup), '-u {0}'.format(_userid)], capture_output=True)
subprocess.call(['useradd', '-m', '-g {0}'.format(_primarygroup), '-G {0}'.format(_secondarygroup), '-u {0}'.format(_userid)])
 import subprocess

 site = 'google.com'
 subprocess.run(['nslookup', f'{site}'])