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

时间:2019-03-19 00:24:12

标签: python python-3.x

这是我的项目结构。

[~/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)!
>>> 

(如果尝试从它所在的目录中导入它,则会收到此错误),

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

[~/Sandbox/pystructure/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.
>>> import pystructure
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/Sandbox/pystructure/pystructure/pystructure.py", line 3, in <module>
    from .utils import spam, eggs
ImportError: attempted relative import with no known parent package
>>> 

我相信我的问题来自对PYTHONPATH的不全面了解,我尝试使用Google谷歌搜索,但是我还没有找到答案...请提供任何见解。

1 个答案:

答案 0 :(得分:2)

从软件包导入时,就是从该软件包的__init__.py导入。...

因此在您的utils软件包中,您的__init__.py为空。

尝试将其添加到您的utils/__init__.py

print("utils/__init__.py")
from . import eggs
from . import spam

现在,当您说from utils import eggs, spam时,是在utils软件包的 init .py中,导入我在其中导入的内容。

此外,在pystructure.py

更改此

from .utils import  eggs, spam 

进入此

from utils import  eggs, spam