找不到Python cli模块导入

时间:2018-08-16 10:31:15

标签: python setuptools docopt

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

这就是我创建名为cli.py的主体的方式

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看起来像这样

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>这样运行时,它可以正常导入吗?

1 个答案:

答案 0 :(得分:0)

该脚本将从其其目录中导入模块,而不是从当前目录中导入模块。这意味着,如果您运行EmailProcessor,它将在org.apache.camel.ExchangeTimedOutException: The OUT message was not received within: 20000 millis due reply message with correlationID: Camel-ID-VMSYS119-1534407032085-0-284 not received on destination: amq.gen-eUU7BRI3Ooo4F8Me7HrPnA. 中寻找/some/directory/cli.py module

我假设您正在使用其他模块的目录运行module,但是安装后,/some/directory/module.py会转到某个cli.py,其中不包含其他模块。而是将它们存储在testing-cli上的/usr/local/bin包中。因此,您实际上需要执行以下操作:

testing

或可能通过相对导入:

sys.path

这意味着从构建目录运行脚本时,脚本将停止运行,除非您已安装软件包。要解决此问题,请使用importlib.import_module("testing." + args['<command>']) ,它将把软件包模拟安装到importlib.import_module("." + args['<command>'], package="testing") 上。 (或更直接,python setup.py develop会将您的当前目录放在sys.path上,并使export PYTHONPATH=.子目录作为软件包可见)