我有一个这样的文件结构:
Folder
Common
foo1.py
TestFolder
foo2.py
我想导入foo2.py
和foo1.py
。我试过了,但在 Ubuntu 上不起作用:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
答案1
Python 如何找到其模块
严格地说,模块是一个 Python 文件,而包裹是一个包含 Python 文件的文件夹,附带一个名为 的文件(可以为空)__init__.py
,用于告诉 Python 这是一个要从中导入模块的包。在这两种情况下,模块都需要.py
扩展名,但导入模块则不需要扩展名(见下文)。
默认情况下,Python 在 中查找其模块和包$PYTHONPATH
。
要找出 $PYTHONPATH 中包含的内容,请在 python (3) 中运行以下代码:
import sys
print(sys.path)
如何添加目录
偶尔
在 Python 文件中,您可以通过在 Python 应用程序或脚本的头部部分添加以下行来偶尔将路径添加到默认路径:
import sys
sys.path.insert(0, "/path/to/your/package_or_module")
例如:
如果我有一个文件夹:/home/myname/pythonfiles
,并且我想要导入module_1.py
位于该目录中的文件,我将其添加到我的代码的头部部分:
import sys
sys.path.insert(0, "/home/myname/pythonfiles")
我可以通过以下方式简单地导入文件module_1.py
:
import module_1
当我创建一个包裹并且想要从包中导入模块,我需要在中创建一个文件夹$PYTHONPATH
,其中包含模块,并附带一个名为的文件(可以为空)__init__.py
例如:
要从名为 的包(文件夹)导入my_package
,/home/myname/pythonfiles
请将/home/myname/pythonfiles
路径添加到您的$PYTHONPATH
,如示例 1 所示,然后使用以下命令导入名为 的模块module_2.py
(在包文件夹内):`
from <packagename> import module_2
永久添加目录$PYTHONPATH
:
将以下行添加到您的~/.profile
文件中。
export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add
子目录
在包内,子目录不能像这样包含;您需要“链接”目录。要导入模块module_3.py
,请在文件夹内subfolder
的文件夹中packagename
:
import packagename.subfolder.module_3
鉴于包中的所有子文件夹都包含它们自己的__init__.py
文件。
当模块与脚本或应用程序位于同一目录中时
当模块与脚本或应用程序位于同一目录时,无需插入模块路径,它会自动添加。
例子:
如果我有一个包含script.py
和的文件夹module.py
,我可以简单地通过以下方式导入模块:
import module
答案2
使用相对导入的正确方法是:
from ..Common import foo1
而且您还需要__init__.py
在所有文件夹中。
答案3
注意:这个答案对于最新版本的 Python 3 来说已经过时了,但对于早期版本来说这里是可用的。有关更多信息,请阅读评论和https://www.python.org/dev/peps/pep-0420/
本质上每一个您要添加到 syspath 的包含 python 代码的文件夹需要一个 __init__.py 文件。这些 __init__.py 文件可以为空。