这是我第一次真正坐下来尝试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也可以帮助解决这个问题。

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

设置到PYTHONPATH =。

其他回答

这个例子适用于Python 3.6。

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

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

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

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

export PYTHONPATH=.
python my_module/__main__.py

您必须将项目的路径附加到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这篇文章

正如在原帖子的评论中所述,这似乎是我使用的python解释器的问题,而不是python脚本的问题。我从WinPython包切换到python.org的官方python 3.6,它工作得很好。谢谢大家的帮助:)

我想明白了。非常令人沮丧,尤其是来自python2。

你必须加上a。对于模块,不管它是相对的还是绝对的。

我创建的目录设置如下所示。

/main.py
--/lib
  --/__init__.py
  --/mody.py
  --/modx.py

modx.py

def does_something():
    return "I gave you this string."

mody.py

from modx import does_something

def loaded():
    string = does_something()
    print(string)

main.py

from lib import mody

mody.loaded()

当我执行main时,会发生这样的事情

$ python main.py
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from lib import mody
  File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
    from modx import does_something
ImportError: No module named 'modx'

我运行2to3,核心输出是这样的

RefactoringTool: Refactored lib/mody.py
--- lib/mody.py (original)
+++ lib/mody.py (refactored)
@@ -1,4 +1,4 @@
-from modx import does_something
+from .modx import does_something

 def loaded():
     string = does_something()
RefactoringTool: Files that need to be modified:
RefactoringTool: lib/modx.py
RefactoringTool: lib/mody.py

我不得不修改modi .py的import语句来修复它

try:
    from modx import does_something
except ImportError:
    from .modx import does_something


def loaded():
    string = does_something()
    print(string)

然后我再次运行main.py,得到了预期的输出

$ python main.py
I gave you this string.

最后,清理一下,让它在2和3之间可以移动。

from __future__ import absolute_import
from .modx import does_something