0

无论出于黑暗历史的什么原因,我们已经在 Windows 上使用 pyodbc 运行我们的系统很长时间了,但它被称为 odbc。

现在尝试移植到 Linux,我已经安装了 pyodbc,但现在我的长时间运行的代码无法“导入 odbc”,尽管“导入 pyodbc”工作正常。

一种解决方案是“if sys.plateform.find('linux')”并根据情况执行“import pyodbc as odbc”或“import pyodbc”,但这似乎很棘手。

有没有办法只重命名鸡蛋?

我天真地尝试重命名这两个文件,“import odbc”找到了这些文件。. . 但由于内部命名,似乎很困惑:

  文件“/local/mnt/workspace/aswp401/source/qcom/qct/modem/arch/sandbox/fmerrow/hub/py/utils/dbutils.py”,第 1 行,在
    导入 odbc
ImportError:动态模块没有定义初始化函数(initodbc)

问题当然是该函数被命名为 initpyodbc,而不是 initodbc。

有没有官方的方法来做这样的重命名?还是 sys.platform 我最好的选择?

坦率

4

1 回答 1

0

处理此问题的最简单方法是:

try:
    import pyodbc
except ImportError:
    import odbc as pyodbc

除非有一些令人信服的理由不这样做,否则不要试图猜测将安装哪个,只需尝试一下即可。这是EAFP的一个例子——但除了通常的优点之外,即使您的猜测后来变得无效,它也会继续工作(例如,因为您设置了 OpenBSD 机器,升级了 Windows 机器上的软件包, ……)。

通常最好先尝试模块的官方当前名称,然后再尝试 old/variant/etc。名称作为后备。

在整个代码中使用官方当前名称通常也更好……但是如果您已经有很多代码可以使用odbc.thisand odbc.that,并且您不相信简单的搜索和替换或其他重构工具可供您使用,你可以import pyodbc as odbc改为。


只是重命名鸡蛋可能会或可能不会起作用(在你的情况下看起来它不会),但即使它这样做也是一个坏主意。

至少,它会混淆您的包管理器(无论是apteasy_installpip还是其他)。例如,它可能无法升级或卸载包,安装依赖它的其他包等。

最糟糕的是,它可能“大部分”工作,但随后失败,因为例如,埋在包中间的 C 扩展模块中的某些代码依赖于完全限定的模块名称,并且该代码仅在一些罕见的边缘被调用您的应用程序的情况。

于 2013-05-22T01:15:09.940 回答