python 2.7.14& 3.6包裹进口的良好做法

时间:2017-12-08 18:04:53

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

我在使用最新的python版本(2& 3)时遇到了一些问题,无法找到一种很好的常用导入方式。

关于我在PyPI上推送的软件包,当我为软件包创建一个子文件夹时,这是正常的,然后在package.module中使用__init__.py进行导入。 我会在模块文件中做同样的事情。

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

层次结构通常以这种方式设计:

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

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

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

我通常将包本身作为项目开发,这意味着package是root。 当我将它导入到项目中时,它们就变成了包,因此不再是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& amp;兼容的导入的良好实践有任何线索? 3,包裹是__main__时哪个也适用?还有奖金,当用py2exe打包时还可以吗?

在某些时候,我为这些进口尝试了一些try/except ImportError块,但是它会让一些东西变得混乱。似乎不可靠。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分: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,而None中的包不是module2

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

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

import package
from package import xxx

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