加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 17:40:02 所属栏目:Python 来源:网络整理
导读:这是我的项目结构. [~/Sandbox/pystructure]:$tree.├── pystructure│ ├── __init__.py│?? ├── pystructure.py│?? └── utils│?? ├── eggs│?? │?? ├── base.py│?? │?? └── __init__.py│?? ├── __init__.py│?? └── spam.p

这是我的项目结构.

[~/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",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,"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",eggs
ImportError: attempted relative import with no known parent package
>>> 

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

最佳答案
从程序包导入时,就是从该程序包的__init__.py导入….

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

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

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

现在,当您说从utils导入鸡蛋时,您是在说垃圾邮件,是从utils包的init.py中导入我在其中导入的内容.

另外,在pystructure.py中

改变这个

from .utils import  eggs,spam 

进入这个

from utils import  eggs,spam 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读