Python:从项目导入而不手动设置PYTHONPATH
如何在不重置PYTHONPATH的情况下从项目中的不同位置导入包和模块(因为这似乎是一个“黑客”解决方案) 例如,如果我有以下目录结构:Python:从项目导入而不手动设置PYTHONPATH,python,Python,如何在不重置PYTHONPATH的情况下从项目中的不同位置导入包和模块(因为这似乎是一个“黑客”解决方案) 例如,如果我有以下目录结构: proj ├── __init__.py ├── important_file.py └── subdirectory/ ├── __init__.py └── script.py 如何从script.py内部导入重要的_file.py?我是否可以在我的项目中指定proj是我的根目录,以便我可以使用import proj.maintal\u
proj
├── __init__.py
├── important_file.py
└── subdirectory/
├── __init__.py
└── script.py
如何从script.py内部导入重要的_file.py?我是否可以在我的项目中指定proj
是我的根目录,以便我可以使用import proj.maintal\u file
导入重要文件?您可以使用
import sys
sys.path.append('/path/to/root/directory')
从您喜欢的任何目录导入。至少,这在过去对我有效。也许还有更少的“黑客”解决方案:)您可以使用相对导入
# inside subdirectory/script.py
from .. import important_file
但实际上,最好的解决方案是将它添加到您的PYTHONPATH
中并执行以下操作
import proj.important_file
我倾向于选择“pythonic”解决方案,而不一定是@Gijs建议的,我称之为更多的解决方案
所以这是我没有做过很多的事情,但是当我需要做的时候,我已经花了很多时间。看看这个。在其中,我有一个单元测试目录,我将core.py导入test_core.py
项目文件夹的结构如下所示
SNA (this is called first-repo on git, but SNA on my machine)
├── bin/
└── sna/
├── core.py
└── test/
└── test_core.py
在text\u core.py
中,我从core.py导入函数。我使用下面的行来实现这一点
from SNA.sna.core import *
所以一般的格式是这样的
from PROJECTNAME.DIR.FILE import * (or specific functions)
希望这有帮助 但是,为什么要在包内的相对导入中使用
PYTHONPATH
?就从。。导入模块是OP问题所需的全部内容。@iGuanaut您根本不应该进行相对导入。当然,两者都做是没有意义的。我已编辑以澄清我的不同意——如果相对导入是项目策略的一部分,则可以。仅仅因为Guido不喜欢它们并不意味着它们错了,否则它们就不会成为语言的一部分。@iGuanaaut我觉得更重要的是,删除它们是一个巨大的向后不兼容的变化。它们无疑会使您的项目更脆弱,更容易中断。绝对导入绝对更好。我们使用绝对导入是因为我们发现它使项目不那么脆弱,更容易适应API更改。但这里不是进行火焰战的地方。这需要SNA
在PYTHONPATH
中,这正是OP出于某种原因试图避免的。我大约在一年前做了这件事,但我不记得对我的python路径做了任何更改。那么,您必须将目录放在路径
或PYTHONPATH
的某个地方。Python不知道如何导入路径上找不到的模块。