Python 相对导入-ModuleNotFoundError:没有名为x的模块
这是我第一次真正坐下来尝试Python3,但似乎失败得很惨。我有以下两个文件:Python 相对导入-ModuleNotFoundError:没有名为x的模块,python,python-3.x,package,python-import,relative-import,Python,Python 3.x,Package,Python Import,Relative Import,这是我第一次真正坐下来尝试Python3,但似乎失败得很惨。我有以下两个文件: test.py config.py config.py中定义了一些函数和一些变量。我将其精简为以下内容: config.py debug = True import config print (config.debug) test.py debug = True import config print (config.debug) 我还有一个\uuuu init\uuuu.py 但是,我得到了以下错误: Mo
debug = True
import config
print (config.debug)
test.py
debug = True
import config
print (config.debug)
我还有一个\uuuu init\uuuu.py
但是,我得到了以下错误:
ModuleNotFoundError: No module named 'config'
ImportError: cannot import name 'config'
我知道py3公约使用绝对进口:
from . import config
但是,这会导致以下错误:
ModuleNotFoundError: No module named 'config'
ImportError: cannot import name 'config'
所以我不知道在这里该做什么。。。非常感谢您的帮助。:) 试过你的例子
from . import config
收到以下系统错误:/usr/bin/python3.4 test.py
回溯(最近一次呼叫最后一次):
文件“test.py”,第1行,在
从…起导入配置
系统错误:未加载父模块“”,无法执行相对导入
这对我来说很有用:
import config
print('debug=%s'%config.debug)
>>>debug=True
用Python测试:3.4.2-PyCharm 2016.3.2
在这个PyCharm旁边,您可以导入这个名称
您必须单击
config
并显示一个帮助图标。
TL;DR:您无法从执行的文件执行相对导入,因为
\uuuu main\uuu
模块不是包的一部分
绝对导入-导入sys.path上可用的内容
相对导入-导入与当前模块相关的内容,必须是包的一部分
如果您以完全相同的方式运行两个变体,那么其中一个应该可以工作。下面是一个例子,可以帮助您了解发生了什么。让我们添加另一个main.py
文件,其总体目录结构如下:
.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py
让我们更新test.py
,看看发生了什么:
#config.py
调试=真
#test.py
打印(名称)
尝试:
#正在尝试在父包中查找模块
从…起导入配置
打印(config.debug)
del-config
除恐怖外:
打印('相对导入失败')
尝试:
#正在尝试在sys.path上查找模块
导入配置
打印(config.debug)
除ModuleNotFoundError外:
打印('绝对导入失败')
#main.py
导入ryan.test
让我们先运行test.py
:
$ python ryan/test.py
__main__
Relative import failed
True
这里的“test”是\uuuu main\uuu
模块,不知道属于某个包的任何信息。但是,import config
应该可以工作,因为ryan
文件夹将被添加到sys.path
让我们运行main.py
:
$ python main.py
ryan.test
True
Absolute import failed
这里的测试在“ryan”包中,可以执行相对导入<代码>导入配置
失败,因为Python 3中不允许隐式相对导入
希望这有帮助
注意:如果您坚持使用Python3,那么就不再需要
\uuu init\uuu.py
文件。此示例适用于Python3.6
我建议在PyCharm中转到Run->Edit Configurations
,删除那里的所有条目,然后再次尝试通过PyCharm运行代码
如果不起作用,请检查您的项目解释器(设置->项目解释器)并运行配置默认值(运行->编辑配置…。正如在原始帖子的评论中所述,这似乎是我出于任何原因使用的python解释器的问题,而不是python脚本的问题。我从python.org将WinPython包切换到官方的python3.6,它运行得很好。谢谢大家的帮助:)我想出来了。非常令人沮丧,尤其是来自蟒蛇2 您必须向模块中添加
,无论它是相对的还是绝对的
我创建了目录设置,如下所示
/main.py
--/lib
--/__init__.py
--/mody.py
--/modx.py
modx.py
def does_something():
return "I gave you this string."
莫迪
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'
我不得不修改mody.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
设置PYTHONPATH也有助于解决此问题 下面是如何在Windows上完成的
set PYTHONPATH=。
在调用模块之前声明正确的sys.path列表:
import os, sys
#'/home/user/example/parent/child'
current_path = os.path.abspath('.')
#'/home/user/example/parent'
parent_path = os.path.dirname(current_path)
sys.path.append(parent_path)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'child.settings')
您可以简单地将以下文件添加到测试目录中,然后python将在测试之前运行它
__init__.py file
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
您必须将项目路径附加到
PYTHONPATH
,并确保使用绝对导入
适用于UNIX(Linux、OSX等) 适用于Windows
set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
绝对进口量
set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\project\
假设我们有以下项目结构
└── myproject
├── mypackage
│ ├── a.py
└── anotherpackage
├── b.py
├── c.py
└── mysubpackage
└── d.py
只需确保从项目的根目录开始引用每个导入。比如说,
# in module a.py
import anotherpackage.mysubpackage.d
# in module b
import anotherpackage.c
import mypackage.a
有关更全面的解释,请参阅根项目目录中的文章Set
PYTHONPATH
环境变量
考虑类UNIX:
export PYTHONPATH=.
试一试
这样做的目的是从同一文件夹级别导入。如果您直接尝试导入它,则假定它是一个从属的,如果您使用的是python 3+,则尝试在下面添加行
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)
对我来说,只需添加当前目录就行了 使用以下结构:
└── myproject
├── a.py
└── b.py
a、 py:
我无法重现错误,您如何执行这段代码?我使用python附带的idle执行它,也作为
python test.py
,它工作得非常好。我没有pyCharm,但可能是pyCharm的一些不良配置导致了这个问题,这很奇怪。我使用的是WinPython——只需从Python.org下载vanilla Python 3.6,就可以了。从没想过要检查翻译!谢谢我猜PYTHONPATH有点怪怪的。检查你