如何在Conda中正确安装自己的本地开发包?

时间:2019-09-04 14:45:45

标签: python pip virtualenv conda

这是我第一次尝试开发软件包而不是脚本,这让我非常困惑。我正在使用Windows 10,并且安装了Python 3.7,并通过Conda 4.7.11对其进行了管理。

TLDR:使用pip install -e时,Conda软件包之间没有正确隔离。

我有一个基本的程序包,其结构如下:

----my_package
    |   LICENSE
    |   README.md
    |   setup.py
    |
    |---my_package
            my_module.py
            __init__.py

my_module.py中是:

def cool_thing():
    print("This is a cool thing!")

__init__.py中是:

from .my_module import cool_thing

因此,当我从外部my_package目录运行Python时,我可以这样做:

$ python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Ana
conda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_package
>>> my_package.cool_thing()
This is a cool thing!

到目前为止,太好了。现在,我想在本地将软件包安装到虚拟Conda环境。我的setup.py文件在其中:

from setuptools import setup

setup(name = "my_package",
      version = "0.1",
      description = "Do something cool!",
      author = "Me",
      license = "MIT",
      packages = ["my_package"],
      zip_safe = False)

在终端中,我这样做:

conda create -n env-my-package
conda activate env-my-package
conda install pip

我在很多地方读到,这就是您应该如何安装本地开发包的方法:

pip install -e .

它告诉我:

Obtaining file:///C:/long/path/to/my_package
Installing collected packages: my-package
  Running setup.py develop for my-package
Successfully installed my-package

pip list告诉我它已安装:

$ pip list
Package      Version   Location
------------ --------- --------------------------
certifi      2019.6.16
my-package   0.1       c:\long\path\to\my_package
pip          19.2.2
setuptools   41.0.1
wheel        0.33.4
wincertstore 0.2

如果导航到其他目录,仍可以将其导入Python:

cd ..
python
$ python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_package
>>> my_package.cool_thing()
This is a cool thing!

所以这似乎很好。 但是,请查看当我切换到其他Conda环境时会发生什么情况

conda deactivate
conda activate env-something-else
python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_package

尽管我们处于一个完全独立的Conda环境中,但未安装my_package,但无论如何仍会导入该软件包,而不会出现错误消息。另一方面,实际上,我们试图使用该软件包会导致错误:

>>> my_package.cool_thing()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'my_package' has no attribute 'cool_thing'

进一步调查,dir(my_package)显示它不具有非隐藏属性:

>>> dir(my_package)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

my_package.__file__输出None,而my_package.__path__给出原始文件所在目录的路径:C:\long\path\to\my_package

因此,似乎Conda环境没有正确隔离。即使无法使用该程序包,它仍然可以看到该程序包。在您问之前,是的,我确实确保在原始pip install -e环境被激活的情况下运行env-my-package

这使我完全不相信自己在Conda环境中所做的一切仍停留在Conda环境中。如果以这种方式“泄漏”,还有什么可能泄漏?在处理此软件包时,我不想意外地污染其他项目。值得庆幸的是,我可以使用pip卸载它并返回到干净状态,但是,在我弄清楚这一点之前,我无法走得更远。我的最终问题:

使用Conda时开发软件包的正确方法是什么?

希望您能原谅我将所有内容写得冗长乏味,但是我想确保我覆盖了所有细节,以防万一。

0 个答案:

没有答案