Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从项目导入而不手动设置PYTHONPATH_Python - Fatal编程技术网

Python:从项目导入而不手动设置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

如何在不重置PYTHONPATH的情况下从项目中的不同位置导入包和模块(因为这似乎是一个“黑客”解决方案)

例如,如果我有以下目录结构:

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不知道如何导入路径上找不到的模块。