我想制作一个cli工具,并找到它作为参考:https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html
所以我创建了一个具有以下结构的目录
$ tree modules_and_packages
modules_and_packages
├── bin
│ ├── cli_script
│ └── cli_script~
├── __init__.py
├── setup.py
├── setup.py~
├── some_module.py
└── some_module.py~
我可以通过pip安装模块而没有任何问题:
pip3 install ./modules_and_packages
Processing ./modules_and_packages
Installing collected packages: some-module
Running setup.py install for some-module ... done
Successfully installed some-module-0.0.0
但是当我在命令行上运行cli_script
时,出现以下错误:
Traceback (most recent call last):
File "/home/david/.local/bin/cli_script", line 3, in <module>
import modules_and_packages
ModuleNotFoundError: No module named 'modules_and_packages'
这是文件中的内容:
setup.py
from setuptools import setup
setup(
name='some_module',
py_modules=['some_module'],
scripts=['bin/cli_script']
)
some_module.py
def some_func():
return 42
bin / cli_script
#!/usr/bin/env python3
import modules_and_packages
print('hello')
如您所见,我只是尝试测试使用模块制作命令行工具的最简单情况。我在这里错了吗?
编辑:
尝试错误的建议后尝试导入some_module时收到的错误消息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/david/.local/lib/python3.6/site-packages/some_module.py", line 1
def some_func():
^
SyntaxError: invalid character in identifier
您未在分发中包括modules_and_packages
。这是因为您的项目结构不正确-将其与您参考的教程中的结构进行比较。它应该如下所示:
myproject
├── modules_and_packages
│ ├── __init__.py
│ └── some_module.py
├── setup.py
└── bin
└── cli_script
现在在安装脚本中将软件包modules_and_packages
包含到dist:
# setup.py
setup(
name='some_module',
packages=['modules_and_packages'],
scripts=['bin/cli_script']
)
如果使用setuptools.find_packages()
函数进行软件包收集,将变得更加容易:
from setuptools import find_packages, setup
setup(
name='some_module',
packages=find_packages(),
scripts=['bin/cli_script']
)
您正在遵循的指南已经5岁了,有点模糊。您可以像这样设置您的cli工具:
~ tree modules_and_packages
├── bin
│ └── cli_script
├── setup.py
└── some_module
├── __init__.py
└── some_module.py
setup.py
from setuptools import setup
setup(
name='some_module',
py_modules=['some_module'],
scripts=['bin/cli_script']
)
some_module / __ init __。py
from .some_module import *
some_module / some_module.py
def some_func():
return 42
bin / cli_script
#!/usr/bin/env python3
import some_module
print('hello')
print(some_module.some_func())
然后安装,在modules_and_packages
目录中,运行:
~ python setup.py develop
然后运行:
~ cli_script
hello
42
或者,如果您熟悉cookiecutter,我建议将this template用于python软件包,因为它具有内置的cli接口。