Python 未找到 cli 模块导入
Python cli module import not found
我正在尝试 运行 打包的 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'],
}
)
关于为什么打包时出现导入错误,但当 运行ning 像 ./cli.py <arg>
时导入正常,有什么想法吗?
脚本将从它的目录导入模块,而不是从您的当前目录。这意味着如果你 运行 /some/directory/cli.py module
,它将在 /some/directory/module.py
.
中寻找 module
我假设您 运行ning cli.py
来自目录和其他模块,但是当它被安装时,testing-cli
进入一些 /usr/local/bin
不包含其他模块。它们存储在 sys.path
上的 testing
包中。所以你实际上需要这样做:
importlib.import_module("testing." + args['<command>'])
或者可能通过相对导入:
importlib.import_module("." + args['<command>'], package="testing")
这意味着当您从构建目录 运行 脚本将停止工作,除非您安装了软件包。要解决这个问题,请使用 python setup.py develop
,这会将软件包模拟安装到 sys.path
上。
(或者更直截了当,export PYTHONPATH=.
这会将您的当前目录放在 sys.path
上,并使 testing
子目录作为一个包可见)
我正在尝试 运行 打包的 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'],
}
)
关于为什么打包时出现导入错误,但当 运行ning 像 ./cli.py <arg>
时导入正常,有什么想法吗?
脚本将从它的目录导入模块,而不是从您的当前目录。这意味着如果你 运行 /some/directory/cli.py module
,它将在 /some/directory/module.py
.
module
我假设您 运行ning cli.py
来自目录和其他模块,但是当它被安装时,testing-cli
进入一些 /usr/local/bin
不包含其他模块。它们存储在 sys.path
上的 testing
包中。所以你实际上需要这样做:
importlib.import_module("testing." + args['<command>'])
或者可能通过相对导入:
importlib.import_module("." + args['<command>'], package="testing")
这意味着当您从构建目录 运行 脚本将停止工作,除非您安装了软件包。要解决这个问题,请使用 python setup.py develop
,这会将软件包模拟安装到 sys.path
上。
(或者更直截了当,export PYTHONPATH=.
这会将您的当前目录放在 sys.path
上,并使 testing
子目录作为一个包可见)