Python Pip从私有服务器上的zip文件安装,不安装要求,当要求满足时,找不到包

Python Pip从私有服务器上的zip文件安装,不安装要求,当要求满足时,找不到包,python,pip,setuptools,Python,Pip,Setuptools,我制作了一个命令行工具来管理服务器端的一些操作,我想从一个私有服务器上使用pip安装轻松地为我的同事分发它,我们有内部工具,并为他们提供更新,所以我们不必拿着大拇指四处走动,做无聊的pip安装-r requirements.txt“适用于每个工作站 我想让它成为一个非常简短的问题,但我相信我必须提供尽可能多的关于设置和项目包的英特尔,让您了解什么是错误的,以及它是如何出错的 我几乎相信我的问题在于setup.py文件的错误配置 首先是服务器,它是一个简单的nginx,指向一个带有basic au

我制作了一个命令行工具来管理服务器端的一些操作,我想从一个私有服务器上使用pip安装轻松地为我的同事分发它,我们有内部工具,并为他们提供更新,所以我们不必拿着大拇指四处走动,做无聊的pip安装-r requirements.txt“适用于每个工作站

我想让它成为一个非常简短的问题,但我相信我必须提供尽可能多的关于设置和项目包的英特尔,让您了解什么是错误的,以及它是如何出错的

我几乎相信我的问题在于setup.py文件的错误配置

首先是服务器,它是一个简单的nginx,指向一个带有basic auth.htpass的文件夹,在这个文件夹中我有一个压缩的项目(也许这是我的第一个错误?)

要使用pip(python 3.5+)下载和安装,我只需运行

pip install http://username:password@pip.myserver.io/tools/mypackage.zip
发生的第一个问题是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文件还包含已安装软件包的de-EGG文件夹,我尝试将其删除,使其与下载/安装完全相同,但仍然会中断,因为它缺少必备条件

如果我安装了独立的需求,我可以使用pip(finally!)安装我的包,但是当我试图通过它的入口点调用它时

stp --help
我收到一个错误,说明“mypackage不存在”

C:\Users\Scoppio>stp --help
Traceback (most recent call last):
File "C:\Users\Scoppio\AppData\Local\Programs\Python\Python36\Scripts\stp-script.py", line 11, in <module>
load_entry_point('MyPackage==0.2.1', 'console_scripts', 'stp')()
File "c:\users\scoppio\appdata\local\programs\python\python36\lib\site-packages\pkg_resources\__init__.py", line 565, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "c:\users\scoppio\appdata\local\programs\python\python36\lib\site-packages\pkg_resources\__init__.py", line 2631, in load_entry_point
return ep.load()
File "c:\users\scoppio\appdata\local\programs\python\python36\lib\site-packages\pkg_resources\__init__.py", line 2291, in load
return self.resolve()
File "c:\users\scoppio\appdata\local\programs\python\python36\lib\site-packages\pkg_resources\__init__.py", line 2297, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "c:\users\scoppio\appdata\local\programs\python\python36\lib\site-packages\mypackage\__init__.py", line 1, in <module>
from mypackage.my_client import myUrls
ModuleNotFoundError: No module named 'mypackage.my_client '
但是在安装了pip之后,我只剩下这些文件了

mypackage/
   __init__.py
   context.py
   my_package.py
我研究了pip制作的临时文件,但整个项目都在那里,它并没有安装我需要的所有文件

到目前为止,我只通过手动添加缺少的文件来安装所有内容,但这扼杀了使用pip安装项目的意义


我相信我误解了setuptools文档,现在我正在跟踪一些可能的方法,比如在设置中向包条目添加更多的包,以及使用额外的要求而不是要求。

因此,在经历了一些头痛之后,我发现我做错了什么

首先,我从我的主包(从我的_包的init.py)导入数据,其中一些未使用的导入被PyCharm隐藏/灰显,这些导入有导入未安装包的文件,这就是它不允许安装运行的原因(如果requirements.txt以前运行过,那么导入就无关紧要了),由于我的导入留在那里,整个setup.py无法工作

setup.py现在具有与原始文件不同的以下条目:

packages=find_packages(),
include_package_data=True,
zip_safe=False,

工作正常:D

对于安装后丢失的文件,解决方案很简单-
packages=find_packages()
应该递归地包含所有子模块。像往常一样导入它,从setuptools Import find_packages导入
。您使用的是
setuptools
还是普通的
distutils
?很好,
distutils
根本不理解关键字
install_requires
。此外,您还有
requirements.txt
install_需要
关键字集-哪一个包含要安装的依赖项?通过单击“setuptools integration”查找,我发现我缺少find_软件包(还有另一个条目,我明天将在此处更正)。此外,要求和安装要求是彼此的精确副本。我相信我使用的是setuptools,因为这就是我要导入的内容和所有内容。好的,那么丢失的软件包的神秘性就解决了。关于未安装的依赖项-如果您下载zip并从本地fs安装它(
pip安装下载/mypackage-0.2.1.zip
),那么deps会安装吗?如果不会,我应该能够使用您提供的安装脚本重现问题。不,当我从本地安装时,即使项目未升级,它也不会安装要求。在运行pip安装之前,我必须运行pip安装-r req…。今天晚些时候,我将对此给予更多关注,并尝试解决问题e错误。根据我所见,您应该能够创建一个模拟项目并运行setup.py,得到与我完全相同的错误,如果您没有错误,比较我们所做的步骤以及它们之间的差异将非常有趣。谢谢!我创建了一个新的venv(
python3.6
),复制了您的
setup.py
,为
README.md
添加了存根,为
mypackage
添加了存根,其中
\uuu init\uuuuuuuuuuu.py
包含两行
\uuuuuu版本
项目名称
,为
输入点添加了存根单击命令,并将
列表替换为
查找包s()
,使用
python setup.py sdist--formats=zip构建包,切换到新的venv,使用
pip install dist/spam-0.1.zip安装包。按照预期安装依赖项。
packages=find_packages(),
include_package_data=True,
zip_safe=False,