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

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


当前回答

对我来说,简单地添加当前目录就可以了。

使用以下结构:

└── myproject
    ├── a.py
    └── b.py

a.py:

from b import some_object
# returns ModuleNotFound error

from myproject.b import some_object
# works

其他回答

要让Bash自动识别您所在的项目目录:

sudo nano ~/.bashrc

OR

sudo nano ~/.bash_profile

在bash文件的底部:

function set_pythonpath {
    export PYTHONPATH="$(pwd):$PYTHONPATH"
}

PROMPT_COMMAND=set_pythonpath

保存并退出:

Ctrl + X Y

通过以下方法测试更改:

cat ~/.bashrc

我在一台Linux机器上工作。当我运行python my_module/__main__.py时,我也遇到了同样的问题。

如果运行export PYTHONPATH=命令,错误就会修复。在运行脚本之前。

export PYTHONPATH=.
python my_module/__main__.py

Try

from . import config

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

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

设置PYTHONPATH也可以帮助解决这个问题。

下面是如何在Windows上做到这一点

设置到PYTHONPATH =。