这是我第一次尝试开发软件包而不是脚本,这让我非常困惑。我正在使用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时开发软件包的正确方法是什么?
希望您能原谅我将所有内容写得冗长乏味,但是我想确保我覆盖了所有细节,以防万一。