使用虚拟环境管理Jupyterhub中的开发/部署包

时间:2018-05-21 20:44:48

标签: python ipython virtualenv jupyter

我有一个我正在为本地服务器开发的软件包。我希望使用import my_package在Jupyter笔记本中导入当前稳定版本,并使用import my_package_dev导入当前开发状态​​(用于端到端测试和填充),或者类似的东西。 / p>

该软件包是使用git进行版本控制的。 master分支包含稳定版本,新的开发工作在develop分支中完成。

我目前将这两个分支分成两个不同的文件夹:

my_package/  # tracks master branch of repository
    setup.py
    requirements.txt
    my_package/
        __init__.py
        # other stuff

my_package_dev/  # tracks develop branch of repository
    setup.py
    requirements.txt
    my_package/
        __init__.py
        # other stuff for dev branch

我的setup.py文件如下所示:

from setuptools import setup
setup(
      name='my_package',  # or 'my_package_dev' for the dev version
      # metadata stuff...
     )

我可以pip install my_package就好了,但我无法在Python中找到任何链接到my_package_dev的名称。

我尝试过的事情

  • pip install my_package_dev

    似乎没有覆盖现有的my_package,但似乎也没有使my_package_dev可用,即使pip说它完成正常。

  • pip install -e my_package_dev

    制作一个鸡蛋并将开发包路径放在easy-install.pth中,但我不能import my_package_dev,而my_package仍然是旧内容。

  • 将文件my_package_dev.pth添加到site-packages目录并填入/path/to/my_package_dev

    没有引起明显的变化。仍然不允许我import my_package_dev

关于解决方案的想法

看起来最好的方法是使用虚拟环境,如答案中所述。

2 个答案:

答案 0 :(得分:2)

使用 pip install ,您可以在setup.py的name属性中按名称安装软件包。如果您已安装并执行 pip freeze ,您将看到列出的两个包。哪些代码可用取决于它们如何包含在Python路径中。

问题是这两个软件包只包含一个名为 my_package 的python模块,这就是为什么你无法导入 my_package_dev (它不存在)的原因。

我建议你为每个版本准备一份工作副本(不修改包名),并使用virtualenv保持环境隔离(一个virtualenv用于稳定版本,另一个用于dev)。 您还可以使用pip的可编辑安装来使用工作副本更新环境。

注意:将 my_package_dev的my_package 模块目录重命名为 my_package_dev 也可以。但是将更改从一个版本合并到另一个版本将更加困难。

答案 1 :(得分:0)

Gonzalo提供的答案让我走上正轨:使用虚拟环境来管理两个不同的构建。我使用:

为主(稳定)分支创建了虚拟环境
$ cd my_package
$ virtualenv venv  # make the virtual environment
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt  # install everything listed as a requirement
(venv) $ pip install -e .  # install my_package dynamicially so that any changes are visible right away
(venv) $ sudo venv/bin/python -m ipykernel install --name 'master' --display-name 'Python 3 (default)'

对于开发分支,我在my_package_dev文件夹中执行了相同的操作,为其提供了不同的--name--display-name值。

请注意,我需要使用sudo作为最终的ipykernel install命令,因为我的系统上一直收到权限被拒绝的错误。我建议首先尝试不使用sudo,但是对于这个系统,它需要在系统范围内安装。

最后,要切换我正在使用的工具版本,我只需选择Kernel -> Change kernel并选择Python 3 (default)Python 3 (develop)。导入保持不变(import my_package),因此笔记本中的任何内容都不得更改。

这不是我理想的情况,因为这意味着每次更改内核时我都必须重新运行整个笔记本,但它确实有效!