我在使用最新的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
块,但是它会让一些东西变得混乱。似乎不可靠。
非常感谢你的帮助!
答案 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)问题,并且不会生成整个项目。