协慌网

登录 贡献 社区

从父文件夹导入模块

我正在运行 Python 2.5。

这是我的文件夹树:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(我__init__.py ,为便于阅读,在此省略)

如何从life nib模块?我希望无需修补 sys.path 就可以做到。

注意:正在运行的主模块位于ptdraft文件夹中。

答案

您可以使用相对导入(python> = 2.5):

from ... import nib

(Python 2.5 的新增功能)PEP 328:绝对和相对导入

编辑:添加了另一个点 “。” 上两个包

相对导入(例如from .. import mymodule )仅在包中起作用。要导入当前模块的父目录中的 “mymodule”,请执行以下操作:

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 

import mymodule

编辑__file__属性并不总是给出。我现在建议不要使用os.path.abspath(__file__)而是使用 inspect 模块来检索当前文件的文件名(和路径)。

对于有关从同级软件包导入的问题,我也发表了类似的答案。你可以在这里看到它。

sys.path hacks 的解决方案

概括

  • packaged_stuff到一个文件夹中(例如 packaged_stuff)
  • 在使用setuptools.setup()的地方使用 create setup.py脚本。
  • pip install -e <myproject_folder>以可编辑状态 pip 安装软件包
  • 使用from packaged_stuff.modulename import function_name

设置

我假设与问题中的文件夹结构相同

.
└── ptdraft
    ├── __init__.py
    ├── nib.py
    └── simulations
        ├── __init__.py
        └── life
            ├── __init__.py
            └── life.py

我打电话给.根文件夹,在我的情况下,它位于C:\tmp\test_imports

脚步

1)将setup.py添加到根文件夹

setup.py的内容可以很简单

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())

基本上,“任何” setup.py都可以工作。这只是一个最小的工作示例。

2)使用虚拟环境

如果您熟悉虚拟环境,请激活一个,然后跳到下一步。虚拟环境的使用不是绝对必需的,但是从长远来看(当您正在进行多个项目时) ,它们确实可以帮助您。最基本的步骤是(在根文件夹中运行)

  • 创建虚拟环境
    • python -m venv venv
  • 激活虚拟环境
    • . /venv/bin/activate (Linux)或./venv/Scripts/activate

要了解更多信息,只需在 Google 上搜索 “python virtualenv 教程” 或类似内容即可。除了创建,激活和停用之外,您可能根本不需要任何其他命令。

创建并激活虚拟环境后,控制台应在括号中提供虚拟环境的名称。

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>

3)pip 以可编辑状态安装项目

使用pip安装顶级软件包myproject 。诀窍是在安装时-e这样,它以可编辑状态安装,并且对. py 文件所做的所有编辑将自动包含在已安装的软件包中。

在根目录中,运行

pip install -e . (注意点,它代表 “当前目录”)

您还可以通过使用pip freeze

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0

4)通过在主文件夹之前添加主文件mainfolder来进行导入

在这个例子中, mainfolderptdraft 。这样的好处是您不会与其他模块名称(来自 python 标准库或 3rd party 模块)发生名称冲突。


用法示例

笔尖

def function_from_nib():
    print('I am the return value from function_from_nib!')

life.py

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()

运行 life.py

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!