使用conda

时间:2016-09-09 22:24:10

标签: python pip anaconda cx-oracle conda

我是Python的新手。我在Ubuntu上使用Anaconda 4.1.1(Python 3.5.2)发行版。我开始研究使用cx_Oracle的项目。 O当然可以使用cx_Oracle安装pip

pip install cx_Oracle

但是每个人似乎都在说Anaconda的conda是一个更好的包管理器,虚拟环境管理器和依赖管理器,pipvirtualenv放在一起。我更愿意使用conda来管理所有内容。

所以我使用以下行创建了一个requirements.txt文件(我的一些队友仍将使用pipvirtualenv)。 (我想支持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_Oracleconda也会使cx_oracle小写o }。由于Python模块导入显然区分大小写,因此我的所有测试都失败,因为他们无法找到带有大写cx_Oracle的{​​{1}}。

我在这里错过了一些简单的东西,因为我是Python的新手?或者Anaconda真的落后于时代而且与O不兼容,这意味着我必须使用cx_Oracle并将其从PyPI中删除?

如果确实存在个案差异,这种情况在Conda vs PiPY上是否常见? Conda政策是否仅以小写字母命名?其他人如何处理这种差异?

2 个答案:

答案 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世界中的包/模块情况:

  • Python模块导入区分大小写。
  • 包名称不区分大小写。
  • 新的最佳实践方法是在包名称中使用全部小写。
  • PyPI存储库保留了大小写; Continuum conda存储库将包名称转换为小写。
  • 无论是从PyPI还是Continuum conda中提取包,并且无论使用哪种包来检索它们,代码中的模块名称及其相应的import语句都应保留库使用的官方案例。 / LI>