【问题标题】:Is there a way to access parent modules in Python有没有办法在 Python 中访问父模块
【发布时间】:2011-07-14 06:14:39
【问题描述】:

我需要知道是否有办法从子模块访问父模块。如果我导入子模块:

from subprocess import types

我有 types - 是否有一些 Python 魔法可以从 types 访问 subprocess 模块?与 ().__class__.__bases__[0].__subclasses__() 类类似的东西。

【问题讨论】:

  • 你的例子很奇怪——types 实际上是标准的 Python types 模块。您的导入行将与import types 执行相同的操作,而types 在这两种情况下将是完全相同的模块对象。
  • subprocess 不是 types 模块的“父”,在任何对我来说似乎有意义或有用的意义上。 subprocess 显然已经导入了types,就像许多其他模块导入types 一样。你想做什么?你想做什么?
  • 我知道types是标准模块,但是我在搜索所有子模块时在子进程模块中发现了它。
  • @John 我试图阻止对文件系统和 shell 的访问。
  • @wizzwizz4 几年前我学会了这种艰难的方式,有人在我的共享主机上清除了磁盘。这是为了我的trypython.jcubic.pl 我需要禁用它,但几年后我在 js 中找到了 brython,现在它使用这个库。

标签: python module parent


【解决方案1】:

我假设您已经不在子流程模块中,您可以这样做

import somemodule
children = dir(somemodule)

然后您可以使用检查模块检查子进程的子进程: http://docs.python.org/library/inspect.html

也许 getmodule 方法对你有用? http://docs.python.org/library/inspect.html#inspect.getmodule

import inspect
parent_module = inspect.getmodule(somefunction)
children = dir(parent_module)
package = parent_module.__package__

在我的机器上,__package__ 为“类型”返回空,但对我自己的模块可能更有用,因为它确实将父模块作为字符串返回

【讨论】:

  • @orangutancloud:但他试图假装他不知道他刚刚从subprocess 导入了types -- 鉴于typessubprocess 是他正在寻找的答案,不是相反。
  • @john 好点,我尝试编辑答案以提供更多帮助。 python 中的检查模块是我最喜欢的语言之一。
  • @orangutancloud: inspect.getmodule(types) 产生的结果与types.__file__ 完全相同(在我的机器上:'C:\\python27\\lib\\types.pyc')。这有多大帮助或相关性?
  • 在我的机器上它确实返回了模块对象,如果你需要一个函数的父级,这很好用,如果你需要父级模块,我刚刚注意到 package 属性它以字符串形式指向父模块,例如 'somepackage.module'
  • inspect.getmodule(types)
【解决方案2】:

如果您访问过一个模块,您通常可以从sys.modules 字典中找到它。 Python 不保留带有名称的“父指针”,特别是因为这种关系不是一对一的。例如,使用您的示例:

>>> from subprocess import types
>>> types
<module 'types' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/types.pyc'>
>>> import sys
>>> sys.modules['subprocess']
<module 'subprocess' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.pyc'>

如果您注意到subprocess 模块中的types 只是其中import types 语句的产物。如果您需要该模块,您只需 import types

事实上,subprocess 的未来版本可能不再导入types,您的代码将会中断。您应该只导入出现在模块的__all__ 列表中的名称;考虑其他名称作为实现细节。

所以,例如:

>>> import subprocess
>>> dir(subprocess)
['CalledProcessError', 'MAXFD', 'PIPE', 'Popen', 'STDOUT', '_PIPE_BUF', '__all__', '__builtins__', '__doc__',
 '__file__', '__name__', '__package__', '_active', '_cleanup', '_demo_posix', '_demo_windows', '_eintr_retry_call',
 '_has_poll', 'call', 'check_call', 'check_output', 'errno', 'fcntl', 'gc', 'list2cmdline', 'mswindows', 'os',
 'pickle', 'select', 'signal', 'sys', 'traceback', 'types']
>>> subprocess.__all__
['Popen', 'PIPE', 'STDOUT', 'call', 'check_call', 'check_output', 'CalledProcessError']

您可以看到subprocess 中可见的大多数名称只是它导入的其他顶级模块。

【讨论】:

    【解决方案3】:

    为了后代,我也遇到了这个并想出了一个班轮:

    import sys
    parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or '__main__']
    

    or '__main__' 部分是为了以防您直接加载文件,它会自行返回。

    【讨论】:

      【解决方案4】:
      full_module_name = module.__name__
      parent, _, sub = full_module_name.rpartition('.')
      if parent:
          parent = import(parent, fromlist='dummy')
      

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 2018-11-08
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 2021-01-29
        • 1970-01-01
        相关资源
        最近更新 更多