python - 提供了完整的路径,如何导入模块?

  显示原文与译文双语对照的内容

如何加载 python 模块以给出它的完整路径? 注意,文件可以在 文件系统 中任意位置,因为它是一个配置选项。

时间:


import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

编译的python 文件和dll有相当的方便函数。

对于 python 3.3 +,这一点更多,不幸的是:


import importlib.machinery

loader = importlib.machinery.SourceFileLoader("module.name","/path/to/file.py")
foo = loader.load_module()
foo.MyClass()

这里方法已经在 python 3.4中被否决,并且似乎没有等效的。 Cf 。http://bugs.python.org/issue21436 web

向 sys.path ( 过度使用 imp ) 添加路径的好处是,当从一个软件包中导入多个模块时,它会简化事情。 例如:


import sys
# the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py
sys.path.append('/foo/bar/mock-0.3.1')

from testcase import TestCase
from testutils import RunTests
from mock import Mock, sentinel, patch


def import_file(full_path_to_module):
 try:
 import os
 module_dir, module_file = os.path.split(full_path_to_module)
 module_name, module_ext = os.path.splitext(module_file)
 save_cwd = os.getcwd()
 os.chdir(module_dir)
 module_obj = __import__(module_name)
 module_obj.__file__ = full_path_to_module
 globals()[module_name] = module_obj
 os.chdir(save_cwd)
 except:
 raise ImportError

import_file('/home/somebody/somemodule.py')

你还可以执行类似的操作,并将配置文件所在的目录添加到 python 加载路径中,然后只需执行一个正常导入,假设你事先知道文件的名称,在本例中。

混乱,但它可以。


configfile = '~/config.py'

import os
import sys

sys.path.append(os.path.dirname(os.path.expanduser(configfile)))

import config

你是指加载还是导入?

你可以操作 sys.path 列表,指定模块的路径,然后导入你的模块。 例如给定的模块位于:

 
/foo/bar.py

 

你可以执行以下操作:


import sys
sys.path[0:0] = '/foo' # puts the/foo directory at the start of your path
import bar

你可以使用


load_source(module_name, path_to_file) 

来自 imp模块的方法。

我相信你可以使用 imp.find_module()imp.load_module() 来加载指定的模块。 你需要分割模块名称路径的禁用状态,如果你想装入 /home/mypath/mymodule.py 你们已经需要做 换句话说,:


imp.find_module('mymodule', '/home/mypath/')

。that但这应该能完成任务。

这应该可以工作


path = os.path.join('./path/to/folder/with/py/files', '*.py')
for infile in glob.glob(path):
 basename = os.path.basename(infile)
 basename_without_extension = basename[:-3]

 # http://docs.python.org/library/imp.html?highlight=imp#module-imp
 imp.load_source(basename_without_extension, infile)

在运行时( python 食谱), 导入包中的模块

http://code.activestate.com/recipes/223972/


###################
## #
## classloader.py #
## #
###################

import sys, types

def _get_mod(modulePath):
 try:
 aMod = sys.modules[modulePath]
 if not isinstance(aMod, types.ModuleType):
 raise KeyError
 except KeyError:
 # The last [''] is very important!
 aMod = __import__(modulePath, globals(), locals(), [''])
 sys.modules[modulePath] = aMod
 return aMod

def _get_func(fullFuncName):
"""Retrieve a function object from a full dotted-package name."""

 # Parse out the path, module, and function
 lastDot = fullFuncName.rfind(u".")
 funcName = fullFuncName[lastDot + 1:]
 modPath = fullFuncName[:lastDot]

 aMod = _get_mod(modPath)
 aFunc = getattr(aMod, funcName)

 # Assert that the function is a *callable* attribute.
 assert callable(aFunc), u"%s is not callable." % fullFuncName

 # Return a reference to the function itself,
 # not the results of the function.
 return aFunc

def _get_class(fullClassName, parentClass=None):
"""Load a module and retrieve a class (NOT an instance).

 If the parentClass is supplied, className must be of parentClass
 or a subclass of parentClass (or None is returned).
"""
 aClass = _get_func(fullClassName)

 # Assert that the class is a subclass of parentClass.
 if parentClass is not None:
 if not issubclass(aClass, parentClass):
 raise TypeError(u"%s is not a subclass of %s" %
 (fullClassName, parentClass))

 # Return a reference to the class itself, not an instantiated object.
 return aClass


######################
## Usage ##
######################

class StorageManager: pass
class StorageManagerMySQL(StorageManager): pass

def storage_object(aFullClassName, allOptions={}):
 aStoreClass = _get_class(aFullClassName, StorageManager)
 return aStoreClass(allOptions)

在Linux中,在 python 脚本所在的目录中添加符号链接。

例如:

在 -s/absolute/path/to/module/module.py/absolute/path/to/script/module. 中

python 将创建/absolute/path/to/script/module.pyc 并在更改/absolute/path/to/module/module.的内容时更新它

然后在 mypythonscript.py 中包含以下内容

从模块导入 *

...