精简版
将其更改为:
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
. 您可以在此线程中详细了解这一点。由于 PyCharm 会为您处理路径业务,因此您实际上并不需要
sys.path.insert(0, os.path.realpath('../text_analysis'))
让您的代码运行。该路径仍将被添加,但不会用于定位包。在你的机器上试试。我想你会发现它是真的。您可以通过运行轻松检查路径
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
相反,我们发现函数终于被导入了。按照这个逻辑,假设我们想留text_analysis.text_refinement
在 import 语句中(无论出于何种原因),我们也可以以不同的方式添加路径:
sys.path.insert(0, os.path.realpath('./'))
但是请注意,这种插入路径的方式有些脆弱。起始位置是您调用的路径python python_file.py
如果您导航到不同的目录,则需要进行os.path.realpath
相应调整。你可以做什么:
sys.path.insert(0, 'full/path/to/application/app/folder')
虽然这假设您的项目的目录/结构不会改变。
有关路径和导入的更深入概述,您可以在此处阅读有关从不同文件夹导入内容的更多信息,如果您更喜欢相对路径导入,这是一个有用的线程。当然,官方文档也是一个不错的起点。