English 中文(简体)
如何进口所有子产品?
原标题:How to import all submodules?

我有一个名录结构如下:

| main.py
| scripts
|--| __init__.py
   | script1.py
   | script2.py
   | script3.py

从<代码>main.py 进口 scripts。 我使用<代码>pkgutils.walk_ Pack<>code>与all__一起尝试,但使用该编码,我只能直接从main下进口所有次程。 http://www.un.org。 我愿将其放在<代码>()下。 进口<条码>所有次程的最好方式是什么<条码>,以便我能从<条码>上查阅<条码>。

EDIT:我对我是一点模糊不清感到担忧。 我愿在业余进口这些子产品,但没有在<条码>_init_.py中明确说明。 我可以使用<代码>pkgutils.walk_ Packages获取代位名称(除非有人知道更好的方式),但我无法确定使用这些名称的最清洁方式(或者可能的话,使用walk_ Pack 回归?)进口这些名称。

最佳回答

<><>Edit>: 这里,一种方式是暂时收回所有物品......

(最高包装目录中的<代码>_init_.py的字体)

import pkgutil

__all__ = []
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module

I m不使用import__(__path__+ . +module_name),因为使用该编码很难适当收回进口包裹。 如果你没有插头子包装,希望避免使用<条码>全球(即:<>/代码>),但这只是这样做的一种方式。

也许有更好的办法,但这是我所能做的最好办法。

www.un.org/spanish/ecosoc (就背景而言,忽略了oth。) 我首先误解问题:

www.un.org/Depts/DGACM/index_russian.htm 看起来像样? 它应当像:

import script1
import script2
import script3
__all__ = [ script1 ,  script2 ,  script3 ]

即便没有界定<>所有__,你也能够这样做,但是,如果你界定,事情(如果别无其他内容的话)将更加干净地工作,即使这只是你进口的物品清单。

问题回答

简单操作,允许在包裹内相对进口:

def import_submodules(package_name):
    """ Import all submodules of a module, recursively

    :param package_name: Package name
    :type package_name: str
    :rtype: dict[types.ModuleType]
    """
    package = sys.modules[package_name]
    return {
        name: importlib.import_module(package_name +  .  + name)
        for loader, name, is_pkg in pkgutil.walk_packages(package.__path__)
    }

使用:

__all__ = import_submodules(__name__).keys()

并非像我所希望的那样几乎是干净的,但没有一个清洁方法为我工作。 这实现了具体行为:

名录结构:

| pkg
|--| __init__.py
   | main.py
   | scripts
   |--| __init__.py
      | script1.py
      | script2.py
      | script3.py

<代码>pkg/scripts/__init__py为空,pkg/__init_.py 包括:

import importlib as _importlib
import pkgutil as _pkgutil
__all__ = [_mod[1].split(".")[-1] for _mod in
           filter(lambda _mod: _mod[1].count(".") == 1 and not 
                               _mod[2] and __name__ in _mod[1],
                  [_mod for _mod in _pkgutil.walk_packages("." + __name__)])]
__sub_mods__ = [".".join(_mod[1].split(".")[1:]) for _mod in
                filter(lambda _mod: _mod[1].count(".") > 1 and not 
                                    _mod[2] and __name__ in _mod[1],
                       [_mod for _mod in 
                        _pkgutil.walk_packages("." + __name__)])]
from . import *
for _module in __sub_mods__:
    _importlib.import_module("." + _module, package=__name__)

尽管它令人迷惑不解,但它应当是可行的。 我先将这一守则用于几个不同的一揽子计划。

仅限load 一揽子计划的所有分单元都可以使用这一简单功能:

import importlib
import pkgutil

def import_submodules(module):
    """Import all submodules of a module, recursively."""
    for loader, module_name, is_pkg in pkgutil.walk_packages(
            module.__path__, module.__name__ +  . ):
        importlib.import_module(module_name)

使用案例:装上所有数据库模型,以便Flavik-Migrate能够发现该表的变化。 使用:

import myproject.models
import_submodules(myproject.models)

我写了一幅小的私人图书馆,并在所有时间添加新的单元,因此我写了一幅剪辑,以寻找文字,并创建<代码>_init__py。 页: 1 文字是在我的包裹——奢侈品——的主要目录之外执行的。

我知道这或许是你重新寻找的答案,但它为我服务,对其他人也是有益的。

#!/bin/bash

echo  Traversing folder hierarchy... 

CWD=`pwd`


for directory in `find pylux -type d -exec echo {} ;`;
do
    cd $directory
    #echo Entering $directory
    echo -n "" > __init__.py

    for subdirectory in `find . -type d -maxdepth 1 -mindepth 1`;
    do
        subdirectory=`echo $subdirectory | cut -b 3-`
        #echo -n        ...$subdirectory
        #echo -e  	->	  import $subdirectory
        echo import $subdirectory >> __init__.py
    done

    for pyfile in *.py ;
    do
        if [ $pyfile = $(echo __init__.py) ]; then
            continue
        fi
        #echo -n        ...$pyfile
        #echo -e  	->	  import `echo $pyfile | cut -d . -f 1`
        echo import `echo $pyfile | cut -d . -f 1` >> __init__.py
    done
    cd $CWD

done


for directory in `find pylux -type d -exec echo {} ;`;
do
    echo $directory/__init__.py:
    cat $directory/__init__.py | awk  { print "	"$0 } 
done

http://www.un.org/Depts/DGACM/index_french.htm Kington saud/a 和 ́s都建立了一种解决办法,即: 如何使用? A/63/25。 我使用的是<<>> > > > > > > > 和> 仅限进口> 。 这样做的目的是为了可靠地进行: 可靠地在德国、德国、德国、德国、德国、德国、德国、德国、德国、德国、德国、德国、波兰、德国、德国、英国、英国、英国、英国、英国、英国、英国、英国、英国、英国、英国、英国、德国、波兰、德国、法国、德国、德国、法国、德国、德国、德国、波兰、德国、德国、瑞典、德国、瑞典、瑞典、瑞典、瑞典、德国、瑞典、瑞典、瑞典、德国、瑞典、瑞典、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞典、瑞士、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞士、瑞士、瑞典、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞典、瑞典、瑞典、瑞典、瑞典、瑞士、瑞典、瑞典、瑞典、瑞士、瑞典、瑞士、瑞典、瑞士、瑞士、瑞典、瑞典、瑞士、瑞士、瑞典、瑞典、瑞士、瑞典、瑞典、瑞士、瑞士、瑞典、瑞典、瑞士、瑞士、瑞典、瑞典、瑞士、瑞典、瑞典、 迄今为止,所有这些问题都是在Catherinethon和Python观测到的。

还指出,欧佩斯仅就从一揽子方案中进口所有modules<>m”的问题进行会谈,这一守则还追溯进口所有包裹。

from pkgutil import walk_packages
from os import path

__all__ = []
__pkg_prefix = "%s." % __name__
__pkg_path = path.abspath(__path__[0]).rsplit("/", 1)[0] #parent directory

for loader, modname, _ in walk_packages([__pkg_path]):
    if modname.startswith(__pkg_prefix):
        #load the module / package
        module = loader.find_module(modname).load_module(modname)
        modname = modname[len(__pkg_prefix):] #strip package prefix from name
        #append all toplevel modules and packages to __all__
        if not "." in modname:
            __all__.append(modname)
            globals()[modname] = module
        #set everything else as an attribute of their parent package
        else:
            #get the toplevel package from globals()
            pkg_name, rest = modname.split(".", 1)
            pkg = globals()[pkg_name]
            #recursively get the modules parent package via getattr
            while "." in rest:
                subpkg, rest = rest.split(".", 1)
                pkg = getattr(pkg, subpkg)
            #set the module (or package) as an attribute of its parent package
            setattr(pkg, rest, module)

作为未来的改进,Ill试图用__getattr__使这一动力成为可能。 h 看一揽子计划,因此,实际模块只有在进入时才能进口。

这对我来说,是第3.3段的。 请注意,这只针对与_init_.py相同的目录中档案中的子模块。 然而,通过一些工作,还可以加强在名录中支持子模块的工作。

from glob import iglob
from os.path import basename, relpath, sep, splitext

def import_submodules(__path__to_here):
    """Imports all submodules.
    Import this function in __init__.py and put this line to it:
    __all__ = import_submodules(__path__)"""
    result = []
    for smfile in iglob(relpath(__path__to_here[0]) + "/*.py"):
        submodule = splitext(basename(smfile))[0]
        importstr = ".".join(smfile.split(sep)[:-1])
        if not submodule.startswith("_"):
            __import__(importstr + "." + submodule)
            result.append(submodule)
    return result




相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签