相关疑难解决方法(0)

如何根据名称导入模块?

我正在编写一个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给出的模块导入的对象或子模块的名称.

来源:https://docs.python.org/3/library/functions.html# 进口

所以目前我有类似的东西:

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)

这很好用,我只是想知道是否可能有更惯用的方法来完成我们正在使用此代码.

请注意,我特别不想使用鸡蛋或扩展点.这不是一个开源项目,我不希望有"插件".重点是简化主应用程序代码,并在每次添加新命令模块时无需修改它.

python python-import

489
推荐指数
7
解决办法
27万
查看次数

如何忽略Python中的弃用警告

我一直这样:

DeprecationWarning: integer argument expected, got float
Run Code Online (Sandbox Code Playgroud)

如何让这条消息消失?有没有办法避免Python中的警告?

python warnings ignore deprecated

151
推荐指数
10
解决办法
14万
查看次数

导入任意python源文件.(Python 3.3+)

如何.pyPython 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.x python-3.3

54
推荐指数
4
解决办法
2万
查看次数

Python 3.4:如何在给定完整路径的情况下导入模块?

如何根据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中通过完整路径导入模块的支持解决方案.

python python-3.x

31
推荐指数
3
解决办法
2万
查看次数

不推荐使用imp模块

每当我尝试在pycharm中使用"sklearn"时,我在控制台上收到以下错误.

DeprecationWarning:不推荐使用imp模块,而是使用importlib; 请参阅模块的文档以了解替代用途import imp

我不确定它是否应该打扰我,因为程序仍在工作,但它很烦人.我怎么能摆脱它?

我做了一切改变,人们在链接问题中推荐,但错误仍然存​​在.

谢谢

python pycharm scikit-learn

16
推荐指数
1
解决办法
2万
查看次数

python-sphinx 记录没有 py 扩展名的脚本

抱歉 - 这是一个完整的问题:

我有几个没有 .py 扩展名的 python 脚本。

我如何说服 Sphinx 它应该记录该脚本?错误示例:

/home/XXX/YYYYY/development/dst/build/index.rst:25:(警告/2)autodoc无法导入/查找模块“site_scons.random”,它报告错误:“没有名为随机的模块”,请检查你的拼写和 sys.path

python python-sphinx

5
推荐指数
1
解决办法
815
查看次数

导入没有.py扩展名的python模块,

我同意有类似的问题,但没有一个符合我的目的.

  • 我有一个python脚本,没有.py扩展名.
  • 我既不能更改文件名也不能添加符号链接.文件名很重要.

  • 我需要将上面提到的文件导入另一个python脚本
  • 我尝试了以下内容

    >>> 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)

  • 我的要求是import语句工作就像它导入如果文件test.py,也就是打印hello world在进口.
  • 有没有办法"运行"使用imp或imortlib导入的模块?

    我想补充一点,我在讨论自动测试项目中control文件,如果重要的话.

    python import

    4
    推荐指数
    1
    解决办法
    2165
    查看次数