如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
我正在研究嵌套matplotlib(MPL)库的文档(个人),它与MPL自己提供的有趣的子模块包不同.我正在编写Python脚本,我希望将从未来的MPL版本中自动生成文档.
我选择了感兴趣的子模块/包,并希望列出我将生成列表并处理它的主要类pydoc
问题是我找不到一种方法来指示Python从字符串加载子模块.这是我尝试的例子:
import matplotlib.text as text
x = dir(text)
Run Code Online (Sandbox Code Playgroud)
.
i = __import__('matplotlib.text')
y = dir(i)
Run Code Online (Sandbox Code Playgroud)
.
j = __import__('matplotlib')
z = dir(j)
Run Code Online (Sandbox Code Playgroud)
以下是通过pprint对上述列表进行3种比较:

我不明白在y对象中加载了什么- 它是基础matplotlib加上其他东西,但它缺少我想要的信息,而且它是matplotlib.text包中的主要类.这是截图(x列表)中的顶级蓝色部分
请不要建议Sphinx采用不同的方法.
我有一个名为foobar的文件(没有.py扩展名).在同一目录中,我有另一个试图导入它的python文件:
import foobar
Run Code Online (Sandbox Code Playgroud)
但这只有在我将文件重命名为foobar.py时才有效.是否可以导入没有.py扩展名的python模块?
更新:该文件没有扩展名,因为我也将它用作独立脚本,我不想输入.py扩展名来运行它.
Update2:我将选择下面提到的符号链接解决方案.
可能重复:
Python中的动态模块导入
我正在编写一个小脚本,从目录中获取文件的名称,并将其传递给另一个模块,然后导入该文件.
所以流程就像1)获取模块名称(将其存储在变量中)2)将此变量名称传递给模块3)导入名称存储在变量名称中的模块
我的代码就像
data_files = [x[2] for x in os.walk(os.path.dirname(sys.argv[0]))]
hello = data_files[0]
modulename = hello[0].split(".")[0]
import modulename
Run Code Online (Sandbox Code Playgroud)
问题是当它到达import语句时,它将modulename作为实际模块名称而不是存储在此变量中的值.我不确定它在python中是如何工作的,任何解决这个问题的帮助都会很棒
在python中,如何在编程运行时动态地将模块添加到包中.
我希望能够从外部进程将模块添加到包目录中,并且能够在我的程序中使用这些新模块:
import package
def doSomething(name):
pkg = __import__("package." + name)
mod = getattr(pkg, name)
mod.doSomething()
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我是否必须取出文件名中的所有空格才能导入它,或者是否有某种方法可以告诉import它有空格?
可能重复:
Python中的动态模块导入
我打算在不久的某个时候制作一套文件,组织它的最好方法是有一个列表,该列表将位于文件的最顶层,之后将会出现一些荒谬的代码来处理该列表控制的内容及其运行方式.我只想写一次所说的列表,并且列表是这种格式的文件夹和文件名列表:
[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)]
Run Code Online (Sandbox Code Playgroud)
如你所见,folder/filename是相同的(有点).文件名是最后的文件夹名称.py,但进行导入XXX你不需要导入XXX.py,所以我没有看到这导致问题.
我面临的问题是使用这种方法导入...
for (testName, auto, hardware, bit) in testList:
print(testName)
paths = "\\" + testName
print paths
addpath(paths)
sys.modules[testName] = testName # One of a few options I've seen suggested on the net
print("Path Added")
test = testName + ".Helloworld()"
eval(test)
Run Code Online (Sandbox Code Playgroud)
因此,对于我所拥有的每个测试,打印名称,组装包含path("\\testName")的字符串,对于此示例,打印测试路径,然后将路径添加到list(sys.path.append(path)),然后打印以确认它发生,然后组装一个将由eval测试主模块执行的字符串,并最终对其进行评估.
如您所见,我目前必须在顶部有一个导入列表.我不能简单地做导入testName(内容testName是我想导入的模块的名称),因为它会尝试查找一个名为的模块testName,而不是一个名为内容的模块testName.
我已经看到了一些这样做的例子,但在我的情况下找不到哪些工作.如果有人可以真正抛出一大堆代码来完成那将是美妙的.
我还要求我没有挂起,绘制,也没有使用eval,它在一个非常受控制的环境中使用(它循环的列表在.py文件中,所以没有"最终用户"应该一塌糊涂).
作为讨论在这里,我们可以使用字符串变量动态导入模块.
import importlib
importlib.import_module('os.path')
Run Code Online (Sandbox Code Playgroud)
我的问题是如何import *从字符串变量?
这样的事情现在还不起作用
importlib.import_module('os.path.*')
Run Code Online (Sandbox Code Playgroud) 可能重复:
Python中的动态模块导入
可能是一个简单的问题!我需要遍历从设置文件传递的类列表(作为字符串).这些类列出如下:
TWO_FACTOR_BACKENDS = (
'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication
'id.backends.TOTPBackend',
'id.backends.HOTPBackend',
#'id.backends.YubikeyBackend',
#'id.backends.OneTimePadBackend',
#'id.backends.EmailBackend',
)
Run Code Online (Sandbox Code Playgroud)
我现在需要authenticate()在每个类上调用该函数(当然除非被注释掉).我很乐意在列表中进行迭代,我只需要知道如何将字符串转换为foreach循环中的Class对象,以便我可以authenticate在其上调用该方法.是否有捷径可寻?
目录结构:
main.py
my_modules/
module1.py
module2.py
Run Code Online (Sandbox Code Playgroud)
module1.py:
class fooBar():
....
class pew_pew_FooBarr()
....
...
Run Code Online (Sandbox Code Playgroud)
如何将所有类从module*添加到没有前缀的main(即使用它们像foo = fooBar(),而不是foo = my_modules.module1.fooBar()).
一个明显的决定是在main.py中写这样的东西:
from my_modules.module1 import *
from my_modules.module2 import *
from my_modules.module3 import *
...
Run Code Online (Sandbox Code Playgroud)
但是我不想在创建新模块N时更改main.py.那有解决方案吗?
我知道导入这样的类不是一个好主意,但我仍然对此感到好奇.
UPD:这个问题不同于这个问题在Python中加载一个文件夹中的所有模块,因为我的问题是加载没有命名空间的模块.
python ×10
import ×4
dynamic ×1
filenames ×1
matplotlib ×1
module ×1
path ×1
python-2.7 ×1
spaces ×1
string ×1