我正在尝试运行打包的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>
这样运行时,它可以正常导入吗?
答案 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=.
子目录作为软件包可见)