使用 conda 获取大小写正确的 cx_Oracle

Getting cx_Oracle with correct case using conda

我是 Python 的新手。我在 Ubuntu 上使用 Anaconda 4.1.1 (Python 3.5.2) 发行版。我开始从事一个使用 cx_Oracle 的项目。 O 当然可以使用 pip.

安装 cx_Oracle
pip install cx_Oracle

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

所以我用下面一行制作了一个 requirements.txt 文件(我的一些队友仍然会使用 pipvirtualenv)。 (我要支持Python3.5,所以需要cx_Oracle5.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 36=]。因为 Python 模块导入显然区分大小写,所以我的所有测试都失败了,因为它们找不到 cx_Oracle 大写 O.

因为我是 Python 的新手,所以我在这里遗漏了一些简单的东西吗?还是 Anaconda 真的落后于时代并且与 cx_Oracle 不兼容,这意味着我将不得不使用 pip install 并将其从 PyPI 中删除?

如果真的存在大小写差异,这种情况在 Conda 和 PiPY 上常见吗?仅以小写字母命名事物是 Conda 政策吗?其他人如何处理差异?

conda 包名称不会影响 import python 中的代码。例如,查看 linux-64 包 here,虽然包名称是 cx_oracle 以符合 conda 生态系统标准,但在 python 中你 必须 import cx_Oracle 导入那个包。 PyPI 上有许多 python 包的示例,其中包名称与包在 python 代码中的导入方式不同。我想这只是 python 怪癖之一。

问题与 Continuum 的 conda 存储库中的小写包名称无关。事实上我错过了一些东西。正如我在问题中提到的那样,我创建了一个新的虚拟环境:

conda create -n foobar --file requirements.txt

需求文件包含 cx_Oracle==5.2.1,我也提到了这一点。但是我 not 提到的是,我随后使用 nosetests 测试了程序,并且 requirements.txt 文件 not包括 nose!这意味着单元测试由 nose 的默认 Anaconda 安装 运行 进行,它不知道 cx_Oracle,而 cx_Oracle 未安装到主 Anaconda 安装中。 (虚拟环境,因为依赖问题,已经拉低了 Python 3.4,而 Anaconda 安装使用的是 Python 3.5。)

无论如何,问题是我无意中使用了默认安装的 Anaconda,而不是我的虚拟环境中的 nose。正如 kalefranz 指出的那样,安装到我的虚拟环境中的 cx_oracle 将需要 import cx_Oracle 而不管其包名的大小写。

我将 nose 安装到我的虚拟环境后,运行ning nosetests 开始工作,因为它选择了 cx_oracle 安装。

总而言之,以下似乎是 Python 世界中的 package/module 案例情况:

  • Python 模块导入区分大小写。
  • 包名称不区分大小写。
  • 新的最佳实践方法是在包名称中全部使用小写字母。
  • PyPI 存储库保留大小写; Continuum conda 存储库将包名称转换为小写。
  • 不管是从PyPI还是Continuum conda拉包,也不管是用哪种包大小写取包,代码中的模块名及其对应的import语句要保留库官方使用的大小写.