【问题标题】:Getting cx_Oracle with correct case using conda使用 conda 获取正确大小写的 cx_Oracle
【发布时间】:2017-01-18 03:09:59
【问题描述】:

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

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 模块导入显然区分大小写,所以我的所有测试都失败了,因为它们找不到带有大写 Ocx_Oracle

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

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

【问题讨论】:

  • 你真的可以导入模块吗?如果是这样,您是否尝试将import cx_Oracle 更改为import cx_oracle as cx_Oracle
  • 我没有尝试更改代码。显然这是最后的手段,但它回避了这个问题。正如我所提到的,我的同事正在使用 pip --- 如果我更改它,代码会中断,但是他们使用 pip 下载 cx_Oracle
  • 使用异常处理:try: import cx_Oracle except ImportError: import cx_oracle as cx_Oracle
  • 你只是改变了文件的顶部。
  • 落后的不是conda,而是cx_Oracle。混合大小写的包名称为un-Pythonic

标签: python pip anaconda cx-oracle conda


【解决方案1】:

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

【讨论】:

  • 这确实是非常的好消息。但我几乎可以发誓,当我从 conda mgckind 频道下载最新版本时,程序在导入时找不到 cx_Oracle。难道是其中一个渠道正在更改导入名称?我是 Python 新手,所以我将不得不返回并查看详细信息以查看导致问题的原因。我希望你是对的!
  • 你是对的!非常感谢你告诉我这件事;你让我对真正的问题走上了正轨。事实证明nosetests 没有在我的虚拟环境中使用cx_oracle;请参阅我的单独答案。这个问题根本与包装盒无关。
【解决方案2】:

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

conda create -n foobar --file requirements.txt

需求文件包含cx_Oracle==5.2.1,我也提到过。但是我没有提到的是,我随后使用nosetests 测试了程序,而requirements.txt 文件没有包含nose!这意味着单元测试是由默认的 Anaconda 安装 nose 运行的,它不知道 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 中拉取包,无论使用哪种包 case 检索,代码中的模块名称及其对应的 import 语句都应保留库使用的官方 case。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2015-02-12
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多