从 Python 中的其他目录导入模块 3
Import module from other directory in Python 3
我知道这个问题已经被问过数千次了,但我仍然没有得到正确的答案并且总是遇到同样的问题。
我有以下文件:
application/app/__init__.py
在这里,我有一些变量,让它成为x
。
那么,我这里还有一个文件:
application/tests/test_1.py
在 test_1.py
我这样做:
from app import x
并且,在 application
文件夹中,我 运行:
python3 tests/test_1.py
但是出现如下错误:
ModuleNotFoundError: No module named 'app'
一个可行的解决方案是,在 test_1.py
内,添加:
import sys
sys.path.append('../')
from app import db
那么如果我这样做:
cd tests
python3 test_1.py
效果很好,但我不想要那个 sys.path.append
而且我也想
python3 tests/test_1.py
另一个解决方案是显式修改 PYTHONPATH
环境变量,但同样,我不想这样做。这个问题没有一个干净的解决方案吗?
不要手动"hack" sys.path。这是一种不好的做法 "quick fix",您可能已经从 Whosebug 的回答中学到了这一点。
Python 在站点包文件夹或 PYTHONPATH 中查找导入。将本地文件夹放入站点包的最简单方法是使用
pip install --editable path/to/myfolder
你的程序"myfolder"中只需要一个setup.py,内容如下
from setuptools import setup
setup(name='myfolder")
名称 "myfolder" 仅在您要卸载它时才重要。但最终这将在环境站点包中创建您的 myfolder 的符号链接,您可以像以前一样继续编辑。但是你的程序有效 "as if installed".
这比更改 PYTHONPATH 更灵活。
至于其他评论:
当“应用程序”链接到站点包并因此通过 sys.path、
识别时
from app import x
是绝对导入,因为 'app' 是顶级文件夹 'application' 中的一个文件夹。
我知道这个问题已经被问过数千次了,但我仍然没有得到正确的答案并且总是遇到同样的问题。
我有以下文件:
application/app/__init__.py
在这里,我有一些变量,让它成为x
。
那么,我这里还有一个文件:
application/tests/test_1.py
在 test_1.py
我这样做:
from app import x
并且,在 application
文件夹中,我 运行:
python3 tests/test_1.py
但是出现如下错误:
ModuleNotFoundError: No module named 'app'
一个可行的解决方案是,在 test_1.py
内,添加:
import sys
sys.path.append('../')
from app import db
那么如果我这样做:
cd tests
python3 test_1.py
效果很好,但我不想要那个 sys.path.append
而且我也想
python3 tests/test_1.py
另一个解决方案是显式修改 PYTHONPATH
环境变量,但同样,我不想这样做。这个问题没有一个干净的解决方案吗?
不要手动"hack" sys.path。这是一种不好的做法 "quick fix",您可能已经从 Whosebug 的回答中学到了这一点。
Python 在站点包文件夹或 PYTHONPATH 中查找导入。将本地文件夹放入站点包的最简单方法是使用
pip install --editable path/to/myfolder
你的程序"myfolder"中只需要一个setup.py,内容如下
from setuptools import setup
setup(name='myfolder")
名称 "myfolder" 仅在您要卸载它时才重要。但最终这将在环境站点包中创建您的 myfolder 的符号链接,您可以像以前一样继续编辑。但是你的程序有效 "as if installed".
这比更改 PYTHONPATH 更灵活。
至于其他评论: 当“应用程序”链接到站点包并因此通过 sys.path、
识别时from app import x
是绝对导入,因为 'app' 是顶级文件夹 'application' 中的一个文件夹。