【问题标题】:Pip install from zip file on private server not installing requirements and when requirements met it does not find the package从私人服务器上的 zip 文件进行 Pip 安装未安装要求,并且在满足要求时找不到软件包
【发布时间】:2017-12-08 13:04:12
【问题描述】:

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

我想提出一个非常简短的问题,但我相信我必须尽可能多地提供有关设置和项目包的信息,以便让您了解出了什么问题以及出了什么问题...

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

首先是服务器,它是一个简单的 nginx,指向一个带有基本身份验证 .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 安全文件,我相信这可能是我的第一个错误,但我无法在 atm 测试它)但它没有安装要求。

zip 文件也有已安装包的 de EGG 文件夹,我尝试删除它,留下它,下载/安装绝对没有任何区别,仍然因为缺少必需品而中断。

如果我确实安装了单独的要求,我可以使用 pip 安装 myPackage(终于!)但是当我尝试通过其入口点调用它时

stp --help

我收到一条错误消息,提示“我的包不存在”。

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 '

您可能会注意到此错误消息来自 Windows 操作系统,但我在 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 文档,现在我正在跟踪一些可能的方法,例如在设置中的包条目中添加更多包,以及使用额外的要求而不是要求。

【问题讨论】:

  • 安装后丢失文件,解决方法很简单——packages=find_packages() 应该递归包含所有子模块。像往常一样导入它,from setuptools import find_packages。你使用setuptools 还是普通的distutils? AFAIK,distutils 根本不理解关键字install_requires。此外,您还设置了 requirements.txtinstall_requires 关键字集 - 哪一个包含您要安装的依赖项?
  • 通过单击“setuptools integration”查看,我发现我缺少 find_packages(以及另一个条目,我明天会在这里纠正它)。此外,需求和 install_requires 是彼此的精确副本。我相信我正在使用 setuptools,因为这是我要导入的所有内容。
  • 好的,丢失包的谜团就解决了。关于未安装的依赖项 - 如果您下载 zip 并从本地 fs (pip install Downloads/mypackage-0.2.1.zip) 安装它,那么 deps 会安装吗?如果没有,我应该能够使用您提供的安装脚本重现该问题。
  • 不,当我从本地安装时,即使项目被解压缩,它也不会安装需求。我必须在运行 pip install -r req... 之前运行 pip install 。 ,今天晚些时候我会更加关注它并尝试解决错误。从我所见,您应该能够创建一个模拟项目并运行 setup.py 并得到与我完全相同的错误,如果您没有错误,比较我们所做的步骤以及它们的方式会非常有趣不同。谢谢!
  • 我创建了一个新的venv (python3.6),复制了你的setup.py,为README.md添加了存根,为mypackage添加了存根,__init__.py包含两行__version__project_name,为entry_points 添加了存根单击命令,并用find_packages() 替换了packages 列表,用python setup.py sdist --formats=zip 构建了包,切换到新的venv,用pip install dist/spam-0.1.zip 安装了包。依赖项按预期安装。

标签: python pip setuptools


【解决方案1】:

所以在头疼之后,我发现自己做错了什么。

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

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

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

工作得很好:D

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2022-07-21
    • 2014-09-17
    • 2021-02-21
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多