2011-11-28 58 views
1

我刚学到了subprocess.check_call()函数。我打算用它来代替我的os.system命令。python子进程“mount”不会提示输入密码

本来,我有我的命令,例如:

os.system("mount -t cifs //source/share /mnt/share -o username=user") 

上面的命令会提示输入密码,如果密码正确,将安装驱动器。

不过,如果我尝试:

cmd_string="mount -t cifs //source/share /mnt/share -o username=user" 

subprocess.check_call(cmd_string.split(" "), shell=True, stdin=sys.stdin) 

它不会询问密码。相反,它只是打印分区。这就像调用没有参数的“mount”命令。

任何想法如何使用check_call并仍然接收来自用户的交互式输入?

+0

也许这个链接http://stackoverflow.com/questions/421206/in-python-how-i-do-use-subprocess-instead-of-os-system将帮助你.. – Manie

+0

顺便说一下,它是'check_call ',而不是'call_check';现在编辑。 –

+0

嗯,感谢您更新错字:P – Patrick

回答

4

调用mount没有参数。如果指定shell=True,则subprocess需要包含参数的整个命令作为一个大字符串传递给shell。如果您指定shell=False(如果未指定,则为缺省值),命令及其参数将作为字符串列表传递,如使用split所做的那样。通过混合这两种形式,您实际上只传递字符串mount作为要执行的命令。删除shell=True或删除.split(" ")。第一种选择通常更好,除非有某些原因需要涉及shell解析,通常需要避免。

+0

谢谢!这看起来像我的问题。删除shell = True后,系统提示输入密码。然而,我的屏幕搞乱了,我无法正确输入密码......我不得不使用“重置”命令来重置我的终端窗口。任何想法? – Patrick

+0

没关系,我正在使用Popen来测试它。在切换回call_check()后,它按预期工作! – Patrick

+0

如果你想要,你可以使用python的getpass模块('from getpass import getpass'; pwd = getpass())将一个“安全”(无回声)密码直接输入到你的程序中。 – jsbueno