【问题标题】:Retrofitting old Python code [duplicate]改造旧的 Python 代码 [重复]
【发布时间】:2014-05-08 14:24:11
【问题描述】:

我有以下一段旧的 python 代码。

cmd = '/usr/bin/passwd --stdin %s' % sys_user
(pin, pout) = os.popen2(cmd)
pin.write(password)
pin.close()
pout.read()
pout.close()

不是我写的。原来的程序员早已不复存在。文档在 zip 旁边。 open2 已弃用。

那么我如何设法转换为使用子流程?我不是 python 程序员,但可以解决问题。

这段代码不起作用,但我显然遗漏了一些东西。

cmd = '/usr/bin/passwd --stdin %s' % sys_user
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
proc.stdin.write(password)
proc.stdin.close()
proc.stdout.read()
proc.stdout.close()

任何帮助将不胜感激。

r

【问题讨论】:

  • 如果将cmd 替换为shlex.split(cmd),代码应该可以工作。如果您不使用输出,那么只需将其设置为subprocess.DEVNULL 或DEVNULL = open(os.devnull, 'wb', 0)(在这种情况下您不需要阅读proc.stdout)而不是PIPE。

标签: python subprocess


【解决方案1】:
  1. 使用subprocess 时,您的呼叫可以是一个列表:cmd = ['/usr/bin/passwd', '--stdin', sys_user]
  2. 您缺少proc.communicate() 步骤。

【讨论】:

    【解决方案2】:

    首先,您最好使用列表作为参数,因为您不使用 shell 来执行程序:

    cmd = ['/usr/bin/passwd', '--stdin', sys_user]
    proc = subprocess.Popen(cmd, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
    

    那么你需要调用proc对象上的通信方法来获取stdin/stdout:

    out, err = proc.communicate(password)
    for l in out.split('\n'):
        print out
    

    你去吧!

    注意:要使用 python 从标准输入中获取密码,请查看getpass 模块。

    【讨论】:

    • proc.communicate 的 passwd 参数从何而来?
    • 来自 OP 的同一个地方。
    • 好的,我明白了,谢谢,列表可以是任意数量的争论
    • 基本上,它是您要给stdin 的passwd 命令的字符串。您可以使用getpass.getpass() 获得。
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2013-07-22
    • 2013-12-08
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多