这是我第一次真正坐下来尝试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'

所以我不知道该怎么做……任何帮助都非常感激。:)


当前回答

Try

from . import config

它所做的是从相同的文件夹级别导入。如果你直接导入,它会假设它是一个下属

其他回答

您可以使用这些语句来设置工作目录,这对我使用python3是有效的

import os
import sys
sys.path.insert(1, os.getcwd())

我看到很多答案导入了sys和os。这是GitHub副驾驶给我的一个没有提到的更短的:

import sys

sys.path.append(__file__.rsplit("/", 1)[0])

将此添加到我的python脚本顶部也解决了这个问题。

这个例子适用于Python 3.6。

我建议在PyCharm中运行->编辑配置,删除那里的所有条目,并尝试通过PyCharm再次运行代码。

如果不工作,检查你的项目解释器(设置->项目解释器)和运行配置默认值(run ->编辑配置…)。

如果你使用的是python3 +,那么尝试添加下面的行

import os, sys
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
sys.path.insert(0, parent_dir_path)

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文件了。