我有一个像这样的文件结构:
Folder
Common
foo1.py
TestFolder
foo2.py
我想输入foo2.py
和foo1.py
。我试过了,但是在Ubuntu上不起作用:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
我有一个像这样的文件结构:
Folder
Common
foo1.py
TestFolder
foo2.py
我想输入foo2.py
和foo1.py
。我试过了,但是在Ubuntu上不起作用:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
Answers:
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
目录中的file ,则将其添加到代码的开头部分:
import sys
sys.path.insert(0, "/home/myname/pythonfiles")
我可以module_1.py
通过以下方式简单地导入文件:
import module_1
当我创建一个包并想要从包中导入模块时,我需要在中创建一个文件夹$PYTHONPATH
,其中包含这些模块,以及一个名为(可以为空)的文件__init__.py
例如:
要从名为my_package
in 的包(文件夹)中导入,请像示例1中一样/home/myname/pythonfiles
,将/home/myname/pythonfiles
路径添加到your $PYTHONPATH
,然后module_2.py
只需使用以下命令导入名为(在package文件夹内)的模块:
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
printenv PYTHONPATH
什么都不是?
sys.path.append("/path/to/your/package_or_module")
还为默认值添加了一条路径,因此不易混淆。相比sys.path.insert(0,...)
其具有0
作为第一个参数。
使用相对导入的正确方法是:
from ..Common import foo1
而且您还需要__init__.py
在所有文件夹中添加一个。
注意:对于最新版本的python 3,此答案已过时,但对于较早的版本,此答案在此处。有关更多信息,请阅读注释和https://www.python.org/dev/peps/pep-0420/
基本上,每个要添加到syspath的带有python代码的文件夹都需要一个__init__.py文件。这些__init__.py文件可以为空。
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
也是一些相关的文档PEP 420,它描述了名称空间包语义的添加
__init__.py
文件夹中是否有文件?这就是python创建包的方式,并允许您从该包中导入模块。guide.python-distribute.org/creation.html