我有一个我正在为本地服务器开发的软件包。我希望使用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
。
看起来最好的方法是使用虚拟环境,如答案中所述。
答案 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
),因此笔记本中的任何内容都不得更改。
这不是我理想的情况,因为这意味着每次更改内核时我都必须重新运行整个笔记本,但它确实有效!