在虚拟机中运行Python3的IPython笔记本
我正在努力搭建一个简单的虚拟机,用来运行基于Python3的IPython笔记本。
我觉得最好的办法是为Python设置一个虚拟环境,然后在里面安装所需的库,再启动IPython服务器。不过,也许把创建虚拟环境的过程放到一个脚本里会更好?
更新:我遇到的一个主要问题是路径不完整……
##Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.ssh.forward_x11 = true
config.vm.provision :puppet,
:options => "--modulepath=/vagrant/modules" do |puppet|
puppet.manifests_path = "."
puppet.manifest_file = "site.pp"
end
config.vm.define :python3 do |python3|
python3.vm.hostname = "python3"
python3.vm.provider :virtualbox do |virtualbox|
virtualbox.name = "python3"
end
python3.vm.network :forwarded_port, guest: 8888, host: 8888
end
end
###site.pp
node default {
include testVM
}
#in modules/testVM//manifests/box/python3.pp
class testVM::box::python3 {
#I was hoping this require statement would install python3 & virtualenv first?
require python3::base
#But it doesn't seem to because the following exec runs first and fails?
#ssh'ing into the VM and the base packages didn't install?
exec {
'py3-venv':
command => '/usr/bin/virtualenv --python=/usr/bin/python3 testpy3',
require => Package['openssh-server','python-virtualenv'];
##I think problem is narrowed down to this - how do I run source or . ?
'py3-activate':
command => 'source testpy3/bin/activate',
require=>Exec['py3-venv'];
}
#Try to add in a dependency to force package install - still doesn't work?
Package['python3']->Exec['py3-venv']
#Install in a small package to check it appears in python3 env
package {
[
'ipythonblocks'
]: ensure => latest,
provider => 'pip';
}
}
#I assumed this would install before the exec fired but it doesn't seem to?
class testVM::box::python3::base {
package { 'python3':
ensure => latest
}
package {
[ 'ipython3',
'python-virtualenv'
]: require => Package['python3'];
}
}
如果我通过SSH登录并手动安装所有东西,我可以在命令行中顺利运行source命令。
但是,如果我尝试用手动安装的内容重新配置机器,仍然会出现错误?
'source testpy3/bin/activate'没有被指定路径。请指定命令或路径。
解决这个问题的方法是:https://ask.puppetlabs.com/question/2177/how-to-execute-source-command/。解决方案是:command => "/bin/bash -c 'source testpy3/bin/activate'"
但又出现了一个新问题:错误:/Stage[main]/Infinite_interns::Box::Python3/Exec[py3-venv]/returns: 从不运行到0失败:/usr/bin/virtualenv –-no-site-packages --python=/usr/bin/python3 testpy3返回了1,而不是[0]中的一个,在/vagrant/modules/infinite_interns/manifests/box/python3.pp:14
哎呀 - 在我的实际脚本中,我写的是/usr/bin/virtualenv –-no-site-packages --python=/usr/bin/python3 testpy3
,其实应该是/usr/bin/virtualenv --python=/usr/bin/python3 testpy3
。
所以现在一切都正常了……
更新2 - 其实还不是。我添加了Exec['py3-venv']->Package['ipythonblocks']
,确保虚拟环境的东西在尝试通过pip安装额外模块之前被安装和执行,但在虚拟机的虚拟环境中我看不到安装的库?
所以现在的问题是:puppet能否在虚拟环境testpy3中通过pip安装库?还是说我不如不使用虚拟环境,直接调用python3和相关工具?
答案:我放弃了虚拟环境,决定“直接”在全局范围内运行python3。我在ubuntu上,所以需要按照https://askubuntu.com/questions/412178/how-to-install-pip-for-python-3-in-ubuntu-12-04-lts中描述的方式安装pip;使用pip3作为提供者,https://github.com/bodepd/puppet-pip/blob/master/lib/puppet/provider/package/pip3.rb
接下来看看这是否有效……
PS:下一步是通过etc/init中的一个文件让笔记本运行——这样做可以吗?(我还没做到那一步!)这样做可能有效吗,还是说Python 3下的IPython笔记本使用不同的启动方式?!
script
export HOME="/root"
/vagrant/notebooks/ipython3 notebook --ip 0.0.0.0
end script
2 个回答
要在虚拟机上搞定 Python 3 和 IPython Notebook,其实很简单。你只需要先安装一个叫做 数据科学工具箱,然后用 apt-get
命令安装 ipython3、ipython3-notebook、python3-pip 和 python3-dev。这些东西和现在的 数据科学工具箱版本配合得很好。
需要说明的是,我还没有完全搞定这个东西(也就是说,它有时候能用,有时候又不行,有些重装能成功,有些却不行[似乎会受到你之后安装的其他软件包的影响,还有就是不干净的DST安装等等])。不过,你可以试着根据数据科学工具箱来搭建你的虚拟机,具体可以在这里找到:http://datasciencetoolbox.org/。在我们办公室,我们也在为学生制作一个基于Python 3和IPython的软件包。
总之,我非常非常想和你聊聊vagrant、python3和ipython之间的互动。