我是Python的新手。我在Ubuntu上使用Anaconda 4.1.1(Python 3.5.2)发行版。我开始研究使用cx_Oracle
的项目。 O当然可以使用cx_Oracle
安装pip
。
pip install cx_Oracle
但是每个人似乎都在说Anaconda的conda
是一个更好的包管理器,虚拟环境管理器和依赖管理器,pip
和virtualenv
放在一起。我更愿意使用conda
来管理所有内容。
所以我使用以下行创建了一个requirements.txt
文件(我的一些队友仍将使用pip
和virtualenv
)。 (我想支持Python 3.5,所以我需要cx_Oracle
5.2.1,这是当前的最新版本。)
cx_Oracle==5.2.1
然后我告诉conda
创建一个虚拟环境foobar
:
conda create -n foobar --file requirements.txt
这失败了;不幸的是cx_Oracle
5.2.1尚未进入Continuum conda存储库(尽管自发布以来已过去一半)。但是,有几个渠道(例如mgckind
)声称提供5.2.1版本。只有一个问题:所有渠道都提供cx_oracle
而非cx_Oracle
(请注意案例差异)。所以这不会起作用:
conda create -n foobar -c mgckind --file requirements.txt
即使我在上面的示例中指定了一个频道,即使requirements.txt
清楚地说明cx_Oracle
,conda
也会使cx_oracle
小写o
}。由于Python模块导入显然区分大小写,因此我的所有测试都失败,因为他们无法找到带有大写cx_Oracle
的{{1}}。
我在这里错过了一些简单的东西,因为我是Python的新手?或者Anaconda真的落后于时代而且与O
不兼容,这意味着我必须使用cx_Oracle
并将其从PyPI中删除?
如果确实存在个案差异,这种情况在Conda vs PiPY上是否常见? Conda政策是否仅以小写字母命名?其他人如何处理这种差异?
答案 0 :(得分:1)
conda包名称不会影响你的import
python中的代码。例如,查看linux-64软件包here,虽然软件包名称cx_oracle
符合conda生态系统标准,但在python中,必须导入该软件包{{1 }}。 PyPI上有许多python包的例子,其中包名与在python代码中导入包的方式不同。只是其中一个python怪癖我猜。
答案 1 :(得分:1)
这个问题与Continuum的conda存储库上的小写包名无关。事实上我错过了一些东西。我在问题中提到过创建了一个新的虚拟环境:
conda create -n foobar --file requirements.txt
需求文件包含cx_Oracle==5.2.1
,我也提到过。但我所做的不提到的是我然后使用nosetests
测试了该程序,而requirements.txt
文件不包括nose
!这意味着单元测试由nose
的默认Anaconda安装运行,该安装不了解cx_Oracle
,但未安装到主Anaconda安装中。 (由于依赖性问题,虚拟环境已经取消了Python 3.4,而Anaconda安装使用的是Python 3.5。)
无论如何,问题是我无意中使用了Anaconda的默认安装中的nose
,而不是来自我的虚拟环境。正如kalefranz指出的那样,安装到我的虚拟环境中的cx_oracle
将需要import cx_Oracle
,无论其包名是什么情况。
只要我将nose
安装到我的虚拟环境中,运行nosetests
就会有效,因为它已经选择cx_oracle
安装。
总之,以下似乎是Python世界中的包/模块情况: