在应用程序中导入模块,而不是包

时间:2016-08-04 09:30:01

标签: python python-3.x

我正在编写一个Python(Python3)应用程序(不是包),并且对正确的目录结构有一些疑问。目前我有这个:

myapp/
    __init__.py
    launch.py
    core/
        __init__.py
        some_core_class.py
        other_core_class.py
    gui/
        __init__.py
        some_gui_class.py
        other_gui_class.py

我希望从我的目录结构中的任何位置使用python launch.py启动应用程序 - 当然要预先设置launch.py的正确路径,例如python myapps/myapp/launch.pysome_core_class.py

在我的模块中,我使用绝对导入,例如在from myapp.core.other_core_class import OtherCoreClass我写launch.py。我在from myapp.core.some_core_class import SomeCoreClass中使用相同的方法,例如myapp

然后通过编写python launch.py直接从dir ImportError: No module named 'myapp'启动它会导致launch.py。我发现我可以通过将from core.some_core_class import SomeCoreClass中的导入更改为myapp来使其工作,但这似乎不是正确的绝对导入,并且与其他文件中的导入不一致。

解决问题的最佳方法是什么?我想避免将PATH添加到UITableView环境变量,这需要用户或安装程序进行手动编辑。我应该如何更改我的代码或导入以使应用程序可以从任何地方启动?这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

我刚刚发现,我可以通过预先

来解决它
import os
import sys
app_parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(app_parent_dir)

launch.py的最开始。但这太丑了,感觉就像一个黑客。肯定有更好的办法。 Python不应该是丑陋的。等待更好的答案...