Python项目结构,项目主文件导入助手

这是我的项目结构。


[~/Sandbox/pystructure]:$ tree

.

├── pystructure

│   ├── __init__.py

│   ├── pystructure.py

│   └── utils

│       ├── eggs

│       │   ├── base.py

│       │   └── __init__.py

│       ├── __init__.py

│       └── spam.py

├── README.md

└── requirements.txt


3 directories, 8 files

这些是文件的内容,


[~/Sandbox/pystructure]:$ cat pystructure/utils/spam.py 

def do():

    print('hello world (from spam)!')


[~/Sandbox/pystructure]:$ cat pystructure/utils/eggs/base.py 

def do():

    print('hello world (from eggs)!')


[~/Sandbox/pystructure]:$ cat pystructure/utils/eggs/__init__.py 

from .base import do


[~/Sandbox/pystructure]:$ cat pystructure/pystructure.py 

#!/usr/bin/python3


from .utils import spam, eggs


def main():

    spam.do()

    eggs.do()


if __name__ == '__main__':

    main()


但是,当我尝试像这样运行应用程序时,出现此错误,


[~/Sandbox/pystructure]:$ python3 pystructure/pystructure.py 

Traceback (most recent call last):

  File "pystructure/pystructure.py", line 3, in <module>

    from .utils import spam, eggs

ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package

或者当我尝试从创建文件的目录中运行代码时(这不是我的愿望,因为我想将它作为服务或使用 cron 运行),


[~/Sandbox/pystructure]:$ cd pystructure/


[~/Sandbox/pystructure/pystructure]:$ python3 pystructure.py 

Traceback (most recent call last):

  File "pystructure.py", line 3, in <module>

    from .utils import spam, eggs

ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package

但是,如果我导入它,它确实可以工作(但是只能从基本目录中...)


[~/Sandbox/pystructure/pystructure]:$ cd ..


[~/Sandbox/pystructure]:$ python3

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 

[GCC 8.2.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> from pystructure import pystructure

>>> pystructure.main()

hello world (from spam)!

hello world (from eggs)!

>>> 

我相信我的问题来自没有完全理解PYTHONPATH,我尝试谷歌搜索,但我还没有找到我的答案......请提供任何见解。


慕斯709654
浏览 215回答 1
1回答

炎炎设计

当你从一个包中导入时,你是从__init__.py那个包的......所以在你的 utils 包中,你__init__.py是空的。尝试将此添加到您的 utils/__init__.pyprint("utils/__init__.py")from . import eggsfrom . import spam现在,当您说from utils import&nbsp; eggs, spam要从utils 包的init .py 中导入我在其中导入的内容时。此外,在 pystructure.py改变这个from .utils import&nbsp; eggs, spam&nbsp;进入这个from utils import&nbsp; eggs, spam&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python