Python 'ImportError: No module named' when importing modules across packages
Python 'ImportError: No module named' when importing modules across packages
我遇到了一个 Python 'ImportError: No module named...' 错误,试图从另一个 Python 中的模块导入另一个 Python 包中的 Python 模块=] 包。下图为目录结构:
必须注意,只有当我从我的终端 运行 脚本时,我才会收到此错误,而当通过 PyCharm 执行时,此脚本成功 运行s。从终端执行时的错误如下:
Traceback (most recent call last):
File "social_networks/linked_data.py", line 15, in <module>
from text_analysis.text_refinement import camel_case_split
ImportError: No module named 'text_analysis'
我尝试了不同的导入方式,例如以下,但均未成功:
方法一:
sys.path.insert(0, os.path.realpath('../text_analysis'))
from text_analysis.text_refinement import camel_case_split
方法二:
from text_analysis.text_refinement import camel_case_split
这个问题的解决方案是什么?
简短版
改为:
sys.path.insert(0, os.path.realpath('./'))
from text_analysis.text_refinement import camel_case_split
或:
sys.path.insert(0, os.path.realpath('./text_analysis'))
from text_refinement import camel_case_split
长版
我已经在我的机器上重新创建了您的项目结构并设法让它工作。让我们一步一步来,这样我们就可以弄清楚发生了什么。
首先,我看到您正在 PyCharm 中处理您的项目。它会自动将项目根目录添加到 PYTHONPATH
。您可以在 thread 中详细了解这一点。由于 PyCharm 为您处理路径业务,因此您并不需要
sys.path.insert(0, os.path.realpath('../text_analysis'))
为您的代码 运行。该路径仍将被添加,但不会用于定位包。在你的机器上试试。我想你会发现这是真的。您可以通过 运行ning
轻松查看路径
for path in sys.path:
print(path)
虽然这是一个有趣的信息,但它没有回答您如何从终端 运行 它的问题。要理解为什么它不是脚本中的 运行,让我们看看在执行方法 1 中的(略微修改的)命令时会有哪些 Python 路径:
sys.path.insert(0, os.path.realpath('../text_analysis'))
try:
from text_analysis.text_refinement import camel_case_split
camel_case_split()
except:
for path in sys.path:
print(path)
# output:
# ~/text_analysis (where ../text_analysis path points to)
# ~/social-network-interest-engine/social_networks (where your file is)
# ... (several other irrelevant paths) ...
我们可以看到 '../text_analysis'
指向一个目录 上面 你需要的。如果我们删除其中一个句号,而是写成 './text_analysis'
,会发生什么情况?输出似乎是我们需要的:
# output:
# ~/social-network-interest-engine/text_analysis
# ~/social-network-interest-engine/social_networks
但是我们还没有导入函数。我们知道这一点是因为我们到达了打印路径的 except
部分。查看导入,我们可以看到我们有 text_analysis.text_refinement
。如果我们已经将它添加到路径中,我们真的需要声明目录名称吗?不我们没有。如果我们写
from text_refinement import camel_case_split
相反,我们发现函数终于被导入了。按照这个逻辑,假设我们想在 import 语句中保留 text_analysis.text_refinement
(无论出于何种原因),我们也可以添加不同的路径:
sys.path.insert(0, os.path.realpath('./'))
但是请注意,这种插入路径的方式有些脆弱。起始位置是您调用 python python_file.py
的路径如果您导航到不同的目录,则需要相应地调整 os.path.realpath
。你可以做什么:
sys.path.insert(0, 'full/path/to/application/app/folder')
虽然这假设您的项目的 directory/structure 不会改变。
要更深入地了解路径和导入,您可以阅读有关从不同文件夹导入内容的更多信息here, and if you prefer relative path imports, this is a useful thread. Of course, official documentation 也是一个不错的起点。
我遇到了一个 Python 'ImportError: No module named...' 错误,试图从另一个 Python 中的模块导入另一个 Python 包中的 Python 模块=] 包。下图为目录结构:
必须注意,只有当我从我的终端 运行 脚本时,我才会收到此错误,而当通过 PyCharm 执行时,此脚本成功 运行s。从终端执行时的错误如下:
Traceback (most recent call last):
File "social_networks/linked_data.py", line 15, in <module>
from text_analysis.text_refinement import camel_case_split
ImportError: No module named 'text_analysis'
我尝试了不同的导入方式,例如以下,但均未成功:
方法一:
sys.path.insert(0, os.path.realpath('../text_analysis'))
from text_analysis.text_refinement import camel_case_split
方法二:
from text_analysis.text_refinement import camel_case_split
这个问题的解决方案是什么?
简短版
改为:
sys.path.insert(0, os.path.realpath('./'))
from text_analysis.text_refinement import camel_case_split
或:
sys.path.insert(0, os.path.realpath('./text_analysis'))
from text_refinement import camel_case_split
长版
我已经在我的机器上重新创建了您的项目结构并设法让它工作。让我们一步一步来,这样我们就可以弄清楚发生了什么。
首先,我看到您正在 PyCharm 中处理您的项目。它会自动将项目根目录添加到 PYTHONPATH
。您可以在 thread 中详细了解这一点。由于 PyCharm 为您处理路径业务,因此您并不需要
sys.path.insert(0, os.path.realpath('../text_analysis'))
为您的代码 运行。该路径仍将被添加,但不会用于定位包。在你的机器上试试。我想你会发现这是真的。您可以通过 运行ning
轻松查看路径for path in sys.path:
print(path)
虽然这是一个有趣的信息,但它没有回答您如何从终端 运行 它的问题。要理解为什么它不是脚本中的 运行,让我们看看在执行方法 1 中的(略微修改的)命令时会有哪些 Python 路径:
sys.path.insert(0, os.path.realpath('../text_analysis'))
try:
from text_analysis.text_refinement import camel_case_split
camel_case_split()
except:
for path in sys.path:
print(path)
# output:
# ~/text_analysis (where ../text_analysis path points to)
# ~/social-network-interest-engine/social_networks (where your file is)
# ... (several other irrelevant paths) ...
我们可以看到 '../text_analysis'
指向一个目录 上面 你需要的。如果我们删除其中一个句号,而是写成 './text_analysis'
,会发生什么情况?输出似乎是我们需要的:
# output:
# ~/social-network-interest-engine/text_analysis
# ~/social-network-interest-engine/social_networks
但是我们还没有导入函数。我们知道这一点是因为我们到达了打印路径的 except
部分。查看导入,我们可以看到我们有 text_analysis.text_refinement
。如果我们已经将它添加到路径中,我们真的需要声明目录名称吗?不我们没有。如果我们写
from text_refinement import camel_case_split
相反,我们发现函数终于被导入了。按照这个逻辑,假设我们想在 import 语句中保留 text_analysis.text_refinement
(无论出于何种原因),我们也可以添加不同的路径:
sys.path.insert(0, os.path.realpath('./'))
但是请注意,这种插入路径的方式有些脆弱。起始位置是您调用 python python_file.py
的路径如果您导航到不同的目录,则需要相应地调整 os.path.realpath
。你可以做什么:
sys.path.insert(0, 'full/path/to/application/app/folder')
虽然这假设您的项目的 directory/structure 不会改变。
要更深入地了解路径和导入,您可以阅读有关从不同文件夹导入内容的更多信息here, and if you prefer relative path imports, this is a useful thread. Of course, official documentation 也是一个不错的起点。