这是我第一次真正坐下来尝试python 3,而且似乎失败得很惨。我有以下两个文件:
test.py
config.py
py中定义了一些函数和一些变量。我将其归纳为以下几点:
config.py
debug = True
test.py
import config
print (config.debug)
我还有一个__init__.py
然而,我得到以下错误:
ModuleNotFoundError: No module named 'config'
我知道py3约定使用绝对导入:
from . import config
然而,这会导致以下错误:
ImportError: cannot import name 'config'
所以我不知道该怎么做……任何帮助都非常感激。:)
您必须将项目的路径附加到PYTHONPATH,并确保使用绝对导入。
适用于UNIX (Linux, OSX,…)
export PYTHONPATH="${PYTHONPATH}:/path/to/your/project/"
对于Windows
set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
绝对的进口
假设我们有如下的项目结构,
└── myproject
├── mypackage
│ ├── __init__.py
│ ├── a.py
└── anotherpackage
├── __init__.py
├── b.py
├── c.py
└── mysubpackage
├── __init__.py
└── d.py
只需确保从项目的根目录开始引用每个导入。例如,
# in module a.py
import anotherpackage.mysubpackage.d
# in module b
import anotherpackage.c
import mypackage.a
有关更全面的解释,请参阅如何修复ModuleNotFoundError和ImportError这篇文章
您必须将项目的路径附加到PYTHONPATH,并确保使用绝对导入。
适用于UNIX (Linux, OSX,…)
export PYTHONPATH="${PYTHONPATH}:/path/to/your/project/"
对于Windows
set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
绝对的进口
假设我们有如下的项目结构,
└── myproject
├── mypackage
│ ├── __init__.py
│ ├── a.py
└── anotherpackage
├── __init__.py
├── b.py
├── c.py
└── mysubpackage
├── __init__.py
└── d.py
只需确保从项目的根目录开始引用每个导入。例如,
# in module a.py
import anotherpackage.mysubpackage.d
# in module b
import anotherpackage.c
import mypackage.a
有关更全面的解释,请参阅如何修复ModuleNotFoundError和ImportError这篇文章
TL;DR:你不能从你执行的文件中进行相对导入,因为__main__模块不是包的一部分。
绝对导入——导入sys.path上可用的东西
相对导入——导入相对于当前模块的东西,必须是包的一部分
如果您以完全相同的方式运行两个变体,那么其中一个应该可以工作。下面是一个示例,可以帮助您理解发生了什么。让我们添加另一个main.py文件,其整体目录结构如下所示:
.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py
让我们更新test.py看看发生了什么:
# config.py
debug = True
# test.py
print(__name__)
try:
# Trying to find module in the parent package
from . import config
print(config.debug)
del config
except ImportError:
print('Relative import failed')
try:
# Trying to find module on sys.path
import config
print(config.debug)
except ModuleNotFoundError:
print('Absolute import failed')
# main.py
import ryan.test
让我们先运行test.py:
$ python ryan/test.py
__main__
Relative import failed
True
这里的"test"是__main__模块,它不知道是否属于包。然而,导入配置应该工作,因为ryan文件夹将被添加到sys.path。
让我们运行main.py:
$ python main.py
ryan.test
True
Absolute import failed
这里test位于“ryan”包内部,可以执行相对导入。导入配置失败,因为Python 3中不允许隐式相对导入。
希望这对你有所帮助。
附注:如果你坚持使用Python 3,就不再需要__init__.py文件了。