我正在编写一个Python应用程序,它将命令作为参数,例如:
$ python myapp.py command1
Run Code Online (Sandbox Code Playgroud)
我希望应用程序是可扩展的,即能够添加实现新命令的新模块,而无需更改主应用程序源.树看起来像:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Run Code Online (Sandbox Code Playgroud)
所以我希望应用程序在运行时找到可用的命令模块并执行适当的命令模块.
Python定义了一个__import__函数,它接受一个模块名称的字符串:
__import __(name,globals = None,locals = None,fromlist =(),level = 0)
该函数导入模块名称,可能使用给定的全局变量和局部变量来确定如何解释包上下文中的名称.fromlist给出了应该从name给出的模块导入的对象或子模块的名称.
所以目前我有类似的东西:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Run Code Online (Sandbox Code Playgroud)
这很好用,我只是想知道是否可能有更惯用的方法来完成我们正在使用此代码.
请注意,我特别不想使用鸡蛋或扩展点.这不是一个开源项目,我不希望有"插件".重点是简化主应用程序代码,并在每次添加新命令模块时无需修改它.
我一直这样:
DeprecationWarning: integer argument expected, got float
Run Code Online (Sandbox Code Playgroud)
如何让这条消息消失?有没有办法避免Python中的警告?
如何.py在Python 3.3+中导入任意python源文件(其文件名可以包含任何字符,并不总是以其结尾)?
我使用imp.load_module如下:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Run Code Online (Sandbox Code Playgroud)
它仍然适用于Python 3.3,但根据imp.load_module文档,它已被弃用:
从版本3.3开始不推荐使用:不需要使用加载器来加载模块,并且不推荐使用find_module().
和imp模块文档建议使用importlib:
注意新程序应使用importlib而不是此模块.
在不使用已弃用的imp.load_module函数的情况下,在Python 3.3+中加载任意python源文件的正确方法是什么?
如何根据Python的完整路径在Python 3.4中加载Python模块?
类似的问题如何在给定完整路径的情况下导入模块?涵盖了3.4之前的Python版本,但结论是Python 3.4中的支持已经弃用了所提出的答案,因此对于Python 3.4的任何解决方案都表示赞赏.
请注意,此问题不是Import abitrary python源文件的副本.(Python 3.3+),因为对此的回答也使用loader.load_module()了Python 3.4中不推荐使用的内容,如回答所述,详细介绍请考虑将importlib.abc.Loader.load_module()和文档放在importlib中.
因此,需要在Python 3.4中通过完整路径导入模块的支持解决方案.
每当我尝试在pycharm中使用"sklearn"时,我在控制台上收到以下错误.
DeprecationWarning:不推荐使用imp模块,而是使用importlib; 请参阅模块的文档以了解替代用途import imp
我不确定它是否应该打扰我,因为程序仍在工作,但它很烦人.我怎么能摆脱它?
我做了一切改变,人们在链接问题中推荐,但错误仍然存在.
谢谢
抱歉 - 这是一个完整的问题:
我有几个没有 .py 扩展名的 python 脚本。
我如何说服 Sphinx 它应该记录该脚本?错误示例:
/home/XXX/YYYYY/development/dst/build/index.rst:25:(警告/2)autodoc无法导入/查找模块“site_scons.random”,它报告错误:“没有名为随机的模块”,请检查你的拼写和 sys.path
我同意有类似的问题,但没有一个符合我的目的.
我既不能更改文件名也不能添加符号链接.文件名很重要.
我尝试了以下内容
>>> imp.load_source('test','.')
<module 'test' from '.'>
Run Code Online (Sandbox Code Playgroud)
和
>>> importlib.import_module('test','.')
<module 'test' from '.'>
Run Code Online (Sandbox Code Playgroud)
模块test就在哪里
print 'hello world'
Run Code Online (Sandbox Code Playgroud)
test.py,也就是打印hello world在进口.有没有办法"运行"使用imp或imortlib导入的模块?
我想补充一点,我在讨论自动测试项目中的control文件,如果重要的话.
python ×7
python-3.x ×2
deprecated ×1
ignore ×1
import ×1
pycharm ×1
python-3.3 ×1
scikit-learn ×1
warnings ×1