无论出于什么原因,黑暗的历史,我们已经在Windows上使用pyodbc运行我们的系统很长一段时间了,但它被称为odbc。
现在尝试移植到Linux,我已经安装了pyodbc,但现在我的长时间运行的代码无法“导入odbc”,尽管“import pyodbc”工作正常。
一个解决方案是“if sys.plateform.find('linux')”并执行“导入pyodbc as odbc”或“import pyodbc”取决于,但这看起来很糟糕。
有没有办法重命名鸡蛋?
我天真地尝试重命名这两个文件,“import odbc”找到这些文件。 。 。但由于内部命名,似乎很困惑:
File "/local/mnt/workspace/aswp401/source/qcom/qct/modem/arch/sandbox/fmerrow/hub/py/utils/dbutils.py", line 1, in import odbc ImportError: dynamic module does not define init function (initodbc)
问题当然是函数名为initpyodbc,而不是initodbc。
是否有一种正式的方式来进行这样的重命名?或者sys.platform是我最好的选择吗?
谢
答案 0 :(得分:0)
处理此问题的最简单方法是:
try:
import pyodbc
except ImportError:
import odbc as pyodbc
除非有一些令人信服的理由不这样做,否则不要试图猜测将安装哪一个,只是尝试一下。这是EAFP的情况 - 但除了通常的优点之外,即使你的猜测后来变得无效,它仍会继续工作(例如,因为你设置了一个OpenBSD机器,升级了包你的Windows机器,...)。
通常最好首先尝试模块的官方当前名称,然后尝试更旧/变体/等。名字作为后备。
在您的代码中使用官方当前名称通常也更好......但如果您已经有很多代码odbc.this
和odbc.that
,您不相信简单的搜索和替换或其他重构工具,您可以import pyodbc as odbc
代替。
重命名鸡蛋可能会或可能不会起作用(看起来它不会在你的情况下),但即使它确实如此也是一个坏主意。
至少,它会让您的包管理器感到困惑(无论是apt
,easy_install
,pip
还是其他内容。例如,它可能无法升级或卸载软件包,安装依赖它的其他软件包等等。
最糟糕的是,它可能“大部分”工作,但随后失败,因为例如,隐藏在包中间的C扩展模块中的一些代码依赖于完全限定的模块名称,并且该代码仅在您的应用程序的一些罕见的边缘情况。