【问题标题】:Passing variables to a subprocess call [duplicate]将变量传递给子进程调用[重复]
【发布时间】:2011-06-15 06:37:57
【问题描述】:

我正在尝试将我的变量从raw_input 传递给我的子进程命令。我是 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"

【问题讨论】:

  • 你有什么问题?请具体。
  • “具体”是——希望——让 n00bz 更清楚地思考他们的问题的一种方式。
  • 确实很旧,但我会注意到,例如,主组被读入primarygroup,但随后尝试通过_primarygroup 访问。

标签: python subprocess


【解决方案1】:

您也可以使用 f 字符串。

 import subprocess

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

【讨论】:

【解决方案2】:

您是否尝试过仅使用 'xxx{0}'.format(variable)see link1or link2

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)])

对我来说很好用

【讨论】:

  • 这是错误的; '-g' 和组名需要是单独的字符串,'-G''-u' 也是如此。试试subprocess.check_call(['useradd', '-m', '-g', _primarygroup, -G, _secondarygroup, '-u', _userid])
【解决方案3】:

您可以先创建 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)

【讨论】:

  • 如果有人试图上传一个名为 $(rm -rf ~).csv 的项目 CSV,运行此代码意味着某人将度过非常糟糕的一天。
  • 还有其他几个reasons to avoid shell=True 并且将字符串粘合在一起以便外壳需要再次将它们分开显然只是浪费。
【解决方案4】:

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

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

subprocess.call 采用与subprocess.Popen 相同的参数:

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


编辑

要一次将所有参数转换为字符串,您可以进行列表理解:

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

【讨论】:

  • 很遗憾,_primarygroup、_secondarygroup 和 _username 的值必须是整数。即:useradd -g 501 -503 -u 501
  • 也许你的问题出在外壳上。程序和脚本的参数只能作为字符串传递(例如,传递字符串 '501' 而不是整数 501)。将这些字符串解析为正确的格式是被调用的过程。
  • 您可以将参数转换为字符串,然后再将它们传递给call;查看我的编辑。
  • 或者只是subprocess.check_call(['useradd', '-m', '-g', str(_primarygroup), '-G', str(_secondarygroup), '-u', str(_userid)])
【解决方案5】:
subprocess.call(['useradd', '-m','-g', _primarygroup, '-G', _secondarygroup, '-u', _userid, _username])

list 传递给subprocess.call

【讨论】:

    【解决方案6】:

    尝试用逗号分隔值:

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

    参见http://docs.python.org/library/subprocess.html#subprocess.call - 它接受一个数组,其中第一个参数是程序,所有其他参数都作为参数传递给程序。

    此外,不要忘记检查函数的返回值是否有零返回码,这意味着“成功”,除非用户是否成功添加对您的脚本无关紧要。

    【讨论】:

    • 我正在尝试将 raw_input 给出的值传递给我的子进程调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多