首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未找到Python模块导入

未找到Python模块导入
EN

Stack Overflow用户
提问于 2018-08-16 10:31:14
回答 1查看 2.5K关注 0票数 0

我正在尝试运行一个打包的cli,它执行动态导入。当我通过主cli脚本运行代码时,它就像预期的那样工作。但是,在我使用setup.py sdist打包代码之后,然后用pip安装dist tar之后。cli本身给出一个导入错误ImportError: No module named。所有模块都与cli.py文件位于同一个文件夹中。

这就是我如何创建我的主程序名为cli.py

代码语言:javascript
复制
def main():
    args = docopt(__doc__, version="1.0")
    argv = [args['<command>']] + args['<args>']
    module = importlib.import_module(args['<command>'])
    print(docopt(module.__doc__, argv=argv))

if __name__ == '__main__':
    main()

我的setup.py看起来像这样

代码语言:javascript
复制
from setuptools import setup
setup(
    name='testing-cli',
    version='0.0.1',
    packages=['testing']
    entry_points = {
        'console_scripts': ['testing-cli = testing.cli:main'],
    }
)

对于为什么在打包时我会得到一个导入错误,但是在像./cli.py <arg>这样运行时,它导入的很好,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 11:11:11

脚本将从其目录导入模块,而不是从当前目录导入模块。这意味着,如果您运行/some/directory/cli.py module,它将在/some/directory/module.py中查找module

我假设您使用其他模块从目录中运行cli.py,但是当它被安装时,testing-cli会转到一些不包含其他模块的/usr/local/bin。相反,它们存储在sys.path上的一个sys.path包中。所以你真的需要这样做:

代码语言:javascript
复制
importlib.import_module("testing." + args['<command>'])

或者可能通过一个相对的进口:

代码语言:javascript
复制
importlib.import_module("." + args['<command>'], package="testing")

这意味着,除非安装了包,否则在从build目录运行脚本时,脚本将停止工作。要解决这个问题,请使用python setup.py develop,它将模拟-将包安装到sys.path上。(或者更简单地说,export PYTHONPATH=.会将当前目录放在sys.path上,并将testing子the作为包显示)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51874929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档