【问题标题】:python 2.7.14 & 3.6 good practice for package importspython 2.7.14 & 3.6 包导入的好习惯
【发布时间】:2018-05-23 00:39:50
【问题描述】:

我在使用最新的 python 版本(2 和 3)时遇到了一些麻烦,无法找到一个好的通用导入方式。

关于我在 PyPI 上推送的包,没关系,因为我为包创建了一个子文件夹,然后在 __init__.py 中使用 package.module 进行导入。 我会在模块文件中做同样的事情。

除此之外,我还有一些我在项目之间共享的包(存储在我的 svn 服务器上),我将它们作为 svn external 导入到项目中。

层次结构通常是这样设计的:

package:
 |- __init__.py
 |- module1.py
 |- module2.py
 |- ...

当我将其导入项目时,文件夹如下所示:

project:
 |- package:
     |- what's above
 |- app.py

我通常将包本身作为项目开发,这意味着package 是root。 当我将它导入项目时,它们变成了包,因此不再是根目录。

当在独立包项目中使用package.module.module 时,这当然不起作用。 在其他项目中使用与包相同的包时,这几乎可以正常工作,但我在 Python 3.6 中遇到了一些问题,告诉我一些名称没有定义(直接从命令行启动时;但在 pycharm 下工作)。 最后但并非最不重要的一点是,当使用 py2exe 生成可执行文件(来自 Python 2.7)时,即使导入似乎没问题,我也会得到一些未定义的名称(类等)异常,因为没有引发此类异常;请注意,我可以在 library.zip 中看到相关的 .pyc 文件。

几个月前我没有遇到这些问题,python 2 和 python 3 的旧版本都没有。

我在最近几天在 StackOverflow、python 文档(2 和 3)以及通过网络进行大量搜索时打开了这个问题,但没有找到与整个问题真正相关的内容。

我的问题是,有没有人知道在 python 2 和 3 之间兼容的导入的良好做法,并且在包为 __main__ 时也可以工作?还有奖金,装上 py2exe 还可以吗?

在某些时候,我为这些导入尝试了一些 try/except ImportError 块,但它有点搞砸了并且似乎不可靠。

非常感谢您的帮助!

【问题讨论】:

    标签: python-3.x python-2.7 python-import py2exe


    【解决方案1】:

    提供一些关于__package__的线索来自:

    Relative imports for the billionth time

    我找到了一些更一致的解决方案,以便在导入前进行检查。

    if __package__ is None or __package__ == '':
        from module1 import *
        from module2 import *
    else:
        from .module1 import *
        from .module2 import *
    

    如果您直接从文件本身运行(比如说module1),__package__ 是无。我仍然必须添加对__package__ == '' 的检查,好像module1 导入module2,包不是Nonemodule2 中。

    在这种情况下,我更喜欢使用相对导入,即使不是真的推荐,因为当用作包时,包本身可以有任何名称而无需更改任何内容。

    关于__init__.py 文件,我只使用相对导入,因为它仅在从主应用程序作为包导入时使用:

    import package
    from package import xxx
    

    这似乎很好地解决了 python 2.7.14 和 3.6 的导入问题,但仍然会导致 py2exe (2.7) 出现问题并且不会生成整个项目。

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多