在jupyter notebook的单元格中使用sudo

时间:2017-07-09 13:29:27

标签: python linux python-3.x ubuntu jupyter-notebook

我正在尝试为jupyter笔记本中的平台制作教程

在某些时候我需要在这样的单元格中运行linux命令:

!sudo apt-get install blah

但是无法弄清楚如何输入sudo pass,我不想用sudo运行jupyter笔记本,不知道怎么做?

5 个答案:

答案 0 :(得分:10)

更新:我检查了所有方法,所有方法都正常运行。

<强> 1

Request password使用getpass module基本上隐藏了用户的输入,然后运行sudo command in python

 import getpass
 import os

 password = getpass.getpass()
 command = "sudo -S apt-get update" #can be any command but don't forget -S as it enables input from stdin
 os.system('echo %s | %s' % (password, command))

<强> 2

 import getpass
 import os

 password = getpass.getpass()
 command = "sudo -S apt-get update" # can be any command but don't forget -S as it enables input from stdin
 os.popen(command, 'w').write(password+'\n') # newline char is important otherwise prompt will wait for you to manually perform newline

上述方法的注意事项:

  

输入密码的字段可能不会出现在ipython中   笔记本。它出现在Mac上的终端窗口中,我想象一下   将出现在PC上的命令shell中。甚至结果细节也会显示在终端中。

3:

您可以将密码存储在mypasswordfile文件中,只需输入单元格:

!sudo -S apt-get install blah < /pathto/mypasswordfile # again -S is important here

如果我想在jupyter笔记本中查看命令的输出,我更喜欢这种方法。

<强>参考文献:

  1. Requesting password in IPython notebook

  2. https://docs.python.org/3.1/library/getpass.html

  3. Using sudo with Python script

答案 1 :(得分:2)

你可以

subprocess.Pope(['sudo', 'apt-get', 'install', 'bla'])

如果你想避免使用python语法,你可以定义自己的单元魔法,为你做到这一点(例如%sudo apt-get install bla)。

答案 2 :(得分:2)

您可以使用{varname}语法(例如this cool blog)将python变量从笔记本传递到外壳,而无需导入ossubprocess模块。

如果您已在python中定义了密码和命令变量(请参见Suparshva的答案),则可以运行以下代码:

!echo {password}|sudo -S {command}

感叹号告诉jupyter在shell中运行它,然后echo命令将从名为password的变量中获取真实密码(例如'funkymonkey'),然后将其通过管道传递到sudo中'd command变量(它是描述shell命令的字符串,例如'apt-get update')。

答案 3 :(得分:2)

对于jupyter在本地主机上运行的情况,我想指出另一种可能性:代替 sudo ,使用 pkexec (或对于较旧的系统 gksu ):

!pkexec apt-get install blah

这将在解决问题的GUI中要求输入密码...

答案 4 :(得分:0)

如果您不想将密码存储在某处,则可以输入:

from getpass import getpass
!echo {getpass()} | sudo -S {command}

P.S。这也回答了伊恩·丹佛斯(Ian Danforth)的问题