导入 Python 模块时 __package__ 为 None

2024-03-16

我想通过以下方式动态导入模块:

我创建一个名为 pkg 的文件夹,其结构如下:

pkg
   |__init__.py
   |foo.py

在头__init__.py,添加此代码片段:

pkgpath = os.path.dirname(pkg.__file__);
for module in pkgutil.iter_modules([pkgpath]):
     __import__(module[1], locals(), globals());
     m = sys.modules[module[1]];
     print m.__package__;

I found m.__package__ is None如果 foo.py 中没有 import 语句 但如果我添加一个简单的导入语句,如下所示:

import os

then m.__package__是“pkg”,这是正确的包名称。 为什么会发生这种情况?

如何导入模块并确保其包属性正确?


The __package__正如您所注意到的,属性的设置不一致。 (更多信息在底部。)但是,您应该始终能够通过获取模块中最后一个句点之前的所有内容来获取包名称。__name__属性。例如。mymod.__name__.rpartition('.')[0]。不过,出于您的目的,在加载模块时构建包/模块层次结构可能会更容易。

例如,这是一个加载包内所有模块、递归加载子包内模块等的函数。(我假设您不介意具有副作用的函数..)

import sys
import pkgutil
from os.path import dirname

def loadModules(pkg):
    pkg._modules = []

    pkgname = pkg.__name__
    pkgpath = dirname(pkg.__file__)

    for m in pkgutil.iter_modules([pkgpath]):
        modulename = pkgname+'.'+m[1]
        __import__(modulename, locals(), globals())
        module = sys.modules[modulename]

        module._package = pkg
        # module._packageName = pkgname

        pkg._modules.append(module)
        if dirname(module.__file__) == pkgpath:
            module._isPackage = False
        else:
            module._isPackage = True
            loadModules(module)


def modName(mod):
    return mod.__name__.rpartition('.')[-1]

def printModules(pkg, indent=0):
    print '\t'*indent, modName(pkg), ':'
    indent += 1
    for m in pkg._modules:
        if m._isPackage:
            printModules(m, indent)
        else:
            print '\t'*indent, modName(m)

import dummypackage
loadModules(dummypackage)
printModules(dummypackage)

示例输出:

dummypackage :
    modx
    mody
    pack1 :
        mod1
        pack2 :
            mod2

更多信息:

The __package__属性由导入系统内部使用,以允许在包内轻松进行相对导入。详细信息请参见PEP 366 http://www.python.org/dev/peps/pep-0366/。为了(大概)节省加载模块的时间,仅当加载的模块导入另一个模块时才设置该属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导入 Python 模块时 __package__ 为 None 的相关文章

  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • Python BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • 动态传递参数

    我正在尝试使用 ExtJS 4 将图像从数据库检索到数据视图 现在我需要动态传递参数 主要是这里 Ext define pkgName v02x003001 SV02X00300102 extend Ext view View alias
  • 下载 Excel 文件时帧加载中断

    我有一个 Angular 脚本 它会访问我的服务器并获取一些数据 该调用如下所示 http post url success function response Do some work Go to the link that the se
  • Jquery上下移动行

    我使用了给出的代码here https stackoverflow com questions 1569889 jquery move table row使用 jquery 在 gridview 中向上 向下移动行 这工作得很好 但是如何实
  • 使用 Kafka 和 NodeJS 进行实时通知

    在我的项目中 我必须设计一个实时通知系统 我就是这样做的 如下图所示 你可以看到我使用 Kafka 作为队列消息系统 并使用 NodeJS 来构建 Websocket Server 和 Kafka Consumers 生产者将收集通知数据并
  • 构建失败,显示 500,请在服务器上运行“jupyter lab build”以获得 Jupyter lab 中的完整输出

    我正在尝试在 jupyter 实验室中添加扩展 我转到扩展选项卡并单击扩展上的 安装 几秒钟后我收到一个弹出窗口说Build failed with 500 please run jupyter lab build on the serve
  • 是否可以将自定义域从一个 Web 应用程序移动到另一个 Web 应用程序?

    我为网络应用程序 webapp a 配置了一个自定义域 www abc com 我想将其转移到 webapp b 而无需停机 如果我尝试将域添加到 webapp b 我会得到 主机名 www abc com 已分配给另一个 Azure 网站
  • Boost R-tree支持层次遍历吗?

    看来R tree http www boost org doc libs 1 61 0 libs geometry doc html geometry reference spatial indexes boost geometry ind
  • Javascript:将日期时间转换为 DD/MM/YYYY - 时间?

    我有一个datetime看起来像这样 2017 04 17 18 26 03 如何使用 javascript 或 jquery 将其转换为这种格式 17 04 2017 18 26 我发现这个问题我认为可能对我有帮助 但答案是转换时间戳 但
  • 添加了空的默认 XML 命名空间 xmlns="" 属性?

    我有简单的代码 我创建根元素并将子元素附加到它 问题是孩子追加了空xmlns 属性 虽然我不期望它 这只是第一个孩子的问题 第二个嵌套级别的孩子已经可以了 所以 下面的代码 DocumentBuilder builder factory n
  • 使用 mvc 身份使用电话号码而不是电子邮件注册

    我的网络应用程序有一个要求 我需要使用电话号码而不是电子邮件和密码来注册用户 系统应输入用户的电话号码并向该电话号码发送 OTP SMS 如果 OTP 匹配 我需要创建用户 我尝试使用 asp net 身份进行 2FA 但它仅在用户已注册并
  • 如何从同一类javascript中的方法返回对象数组

    我是 JavaScript 新手 我想要一个类方法返回由同一类实例化的对象数组 怎么做 目前 基本上以下是我所讨论的代码的一般结构 class myClass constructor name password emailid id thi
  • 我可以在 schema.org 丰富摘要的 Span 标记中使用多个 ItemProps 吗?

    假设我想向以下句子添加丰富的摘要 我在纽约生活和工作 由于纽约既是我的居住地 也是我工作的城市 理论上我希望使用 schema org 标准来标记该行 div I live and work in span New York span di
  • 预先输入下拉列表中的全局页脚

    我有一个包含 2 个类别的预输入菜单 但在这些类别下我需要一个按钮 如何添加此全局页脚 以便在缺少第二个类别时可用 我所做的是在每个数据集中添加一个页脚 但使用 CSS 隐藏除最后一个之外的所有数据集 代码如下 search query t
  • 如何更改 selected.js 中警报的语言?

    When you type in an unavailable option in the multiple select box in chosen js it will generate the output No results ma
  • 锁定整个数据库?

    我有非常奇怪的用户需求 我试图向他们解释有更好的方法来支持他们的业务流程 但他们不想听 我很想走开 但我首先想看看是否还有其他方法 有什么方法可以锁定整个数据库而不是行锁或表锁 我知道我也许可以将数据库置于单用户模式 但这意味着一次只有一个
  • Maven Surefire:无法分叉并行测试执行

    使用 Maven Surefire 我无法分叉并行测试执行 也就是说 我的每个测试用例都必须在单独的 JVM 中运行 因此需要分叉 此外 我希望我的测试用例并行运行 第一部分工作没有问题 我能够在自己的 JVM 中运行每个测试用例 然而 第
  • 如何在不实际构建东西的情况下使 gradle 下载依赖项

    到了新的环境gradle build需要相当长的时间 因为必须下载所有依赖项 有没有办法只下载依赖项以加快后续构建的速度 这样我们就可以预先填充 CI 构建环境 编辑 针对 Gradle 6 进行了更新 一些注意事项 这种新方法将 jar
  • dplyr 用动态列进行总结

    我正在尝试对我的 postgres 数据库使用 dplyr 并执行一个简单的函数 如果我直接解析列名 一切都会正常 但是我想动态地执行此操作 即对另一个数据帧中的每个列名进行排序 我遇到的问题是对于前两个计算 我得到了正确的结果 假设第一个
  • 在 Eclipse 中找不到库“libmaliinstr.so”

    请帮我 我的Android应用程序是一个闹钟应用程序 可以在许多Android设备上按时播放 但是在华为荣耀C3等某些设备上播放时 我的代码出现错误 错误是 09 26 18 17 19 119 E linker 23841 load li
  • 导入 Python 模块时 __package__ 为 None

    我想通过以下方式动态导入模块 我创建一个名为 pkg 的文件夹 其结构如下 pkg init py foo py 在头 init py 添加此代码片段 pkgpath os path dirname pkg file for module