首页 > Python > Python从父文件夹导入模块

Python从父文件夹导入模块

上一篇 下一篇

我正在运行Python 2.5。

这是我的文件夹树:

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

(我在每个文件夹中也有,为了便于阅读,这里省略了)__init__.py

如何从模块内部导入模块?我希望可以在不修补 sys.path 的情况下做到这一点。niblife

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

分割线

网友回答:

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

from ... import nib

(Python 2.5 中的新增功能)PEP 328:绝对和相对进口

编辑:添加了另一个点“.”以上升两个包

分割线

网友回答:

我也发布了类似的答案,关于从兄弟姐妹包裹进口的问题。你可以在这里看到它。

没有黑客的解决方案sys.path

总结

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

设置

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

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

我调用根文件夹,在我的情况下,它位于 ..C:tmptest_imports

步骤

  1. 将 a 添加到根文件夹

    其内容可以很简单
    setup.pysetup.py
    from setuptools import setup, find_packages

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

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

  1. 使用虚拟环境

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

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

要了解更多信息,只需谷歌搜索“python virtualenv tutorial”或类似内容。除了创建、激活和停用之外,您可能永远不需要任何其他命令。

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

PS C:tmptest_imports> python -m venv venv
PS C:tmptest_imports> .venvScriptsactivate
(venv) PS C:tmptest_imports>
  1. 点子 以可编辑状态安装项目

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

在根目录中,运行

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

您还可以看到它是通过使用pip freeze

(venv) PS C:tmptest_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:tmptest_imports> pip freeze
myproject==1.0
  1. 通过预置到每个导入进行导入mainfolder

在此示例中,将为 。这样做的好处是,您不会与其他模块名称(来自 python 标准库或第三方模块)发生名称冲突。mainfolderptdraft


示例用法

nib.py

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:tmptest_imports> python .ptdraftsimulationslifelife.py
I am the return value from function_from_nib!

分割线

网友回答:

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

import os
import sys
import 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__)

模板简介:该模板名称为【Python从父文件夹导入模块】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 236次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-09
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 单页式简历模板 微信素材 响应式 html5 微信图片 微信文章 企业网站 自适应 微信公众平台
您可能会喜欢的其他模板