我制作了一个命令行工具来管理服务器端上的某些操作,我想从我们的内部工具中使用pip install
轻松地为我的同事分配它,并且为了为他们提供更新,因此我们不必用拇指脚走来走去,并为他们拥有的每个工作站做无聊的pip install . -r requirements.txt
。
我会尽量保持简短,但我认为我必须包括项目和包装详细信息才能找到问题。我怀疑setup.py
文件的不良配置。
服务器
这是一个简单的nginx,指向带有基本auth .htpass
的文件夹。在文件夹中,我有Zipped Project(也许这是我的第一个错误?)。
要使用pip
(Python 3.5 )下载和安装,我只需运行
pip install http://username:password@pip.myserver.io/tools/mypackage.zip
setup.py
以下setup.py
中的要求未下载。
import os
from setuptools import setup
from mypackage import __version__, project_name
# Utility function to read the README file.
# Used for the long_description. It's nice, because now 1) we have a top level
# README file and 2) it's easier to type in the README file than to put a raw
# string in below ...
def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()
setup(
name=project_name,
version=__version__,
description='Command line client for maintenance and odd jobs on the server',
long_description=read('README.md'),
classifiers=[
"Development Status :: 2 - Alpha",
"Topic :: Utilities :: Rest",
"Framework :: Click",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
],
keywords='cli rest client admin',
author="Myself",
author_email='lucas@email.com',
packages=['mypackage'],
zip_safe=True,
install_requires=[
'certifi==2017.7.27.1',
'chardet==3.0.4',
'click==6.7',
'idna==2.6',
'requests==2.18.4',
'urllib3==1.22',
'terminaltables==3.1.0',
'tqdm==4.19.4',
'aiohttp==2.3.3',
'aiodns==1.1.1',
'cchardet==2.1.1',
'async-timeout==2.0.0',
],
entry_points='''
[console_scripts]
stp = mypackage.MyPackage:cli
stp-config = mypackage.MyPackage:config
''',
)
它试图下载ZIP文件,setup.py
标记了Zip'Safe'(我相信这可能是我的第一个错误,但我无法测试它的ATM),但它没有安装要求。
zip文件还具有已安装软件包的EGG
文件夹。我尝试将其删除或离开它。下载/安装都没有任何不同。它仍然破裂,因为它缺乏依赖关系。
如果我单独安装要求,我可以使用pip
安装CC_11(最后!),但是当我尝试通过其入口点调用它
stp --help
我收到一个错误,说" mypackage不存在"。
C:UsersScoppio>stp --help
Traceback (most recent call last):
File "C:UsersScoppioAppDataLocalProgramsPythonPython36Scriptsstp-script.py", line 11, in <module>
load_entry_point('MyPackage==0.2.1', 'console_scripts', 'stp')()
File "c:usersscoppioappdatalocalprogramspythonpython36libsite-packagespkg_resources__init__.py", line 565, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "c:usersscoppioappdatalocalprogramspythonpython36libsite-packagespkg_resources__init__.py", line 2631, in load_entry_point
return ep.load()
File "c:usersscoppioappdatalocalprogramspythonpython36libsite-packagespkg_resources__init__.py", line 2291, in load
return self.resolve()
File "c:usersscoppioappdatalocalprogramspythonpython36libsite-packagespkg_resources__init__.py", line 2297, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "c:usersscoppioappdatalocalprogramspythonpython36libsite-packagesmypackage__init__.py", line 1, in <module>
from mypackage.my_client import myUrls
ModuleNotFoundError: No module named 'mypackage.my_client '
您可能会注意到此错误消息来自Windows OS,但是我在Mac OSX和Ubuntu上遇到了类似的错误16。
,如果我转到应该在网站包中安装的文件夹并打开它,我的软件包" mypackage'只有在第一个文件夹级别内的文件,没有明显的原因,它丢弃了所有上层我为该项目提供的文件夹。
文件结构
所以我的项目结构是:
core/
setup.py
requirements.txt
readme.md
mypackage/
__init__.py
context.py
my_package.py
my_client/
__init__.py
rest_client.py
my_urls.py
my_plugins/
__init__.py
cmd_1.py
cmd_2.py
...
cmd_n.py
utils/
__init__.py
print_table.py
但是在使用pip
安装后,我只剩下那些文件
mypackage/
__init__.py
context.py
my_package.py
我探索了临时文件pip
制作,但是整个项目都存在,它根本不安装我需要的所有文件。
到目前为止,我仅通过手动添加缺少文件来安装所有内容,但它使使用PIP安装项目的要点。
我相信我误解了setuptools
文档,现在我正在追踪一些可能的方法,例如在设置中的包装条目中添加更多软件包,并使用" extra"要求而不是要求。
所以在头痛后,我发现了我做错了什么。
首先,我是从我的主软件包中导入数据(来自 init .package的。未安装的软件包,这就是为什么不允许安装运行的原因(如果要求之前运行了,则导入无关)那里。
setup.py现在具有以下条目与原始条目相差:
packages=find_packages(),
include_package_data=True,
zip_safe=False,
工作正常:D