python - 在私有(private)服务器上从 zip 文件进行 Pip 安装未安装要求,并且当满足要求时找不到软件包

标签 python pip setuptools

我制作了一个命令行工具来管理服务器端的一些操作,我想使用 pip install 轻松地将它分发给我的同事。从我们拥有的内部工具的私有(private)服务器,并向他们提供更新,这样我们就不必拿着拇指棒四处走动并做无聊的事情 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

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 文件还包含 EGG已安装包的文件夹。我尝试删除它或保留它。对于下载/安装来说两者都没有任何区别。它仍然会崩溃,因为它缺少依赖项。

如果我单独安装需求,我可以安装myPackage使用pip (最后!)但是当我尝试通过入口 pip 调用它时

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 '

您可能会注意到此错误消息来自 Windows 操作系统,但我在 Mac OSX 和 Ubuntu 16 上收到类似的错误。

如果我转到应该将其安装在站 pip 包内的​​文件夹并打开它,我的包“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文档,现在我正在跟踪一些可能的方法,例如向设置中的包条目添加更多包,以及使用“额外”要求而不是要求。

最佳答案

经过一番头痛之后,我发现我做错了什么。

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

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

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

工作得很好:D

关于python - 在私有(private)服务器上从 zip 文件进行 Pip 安装未安装要求,并且当满足要求时找不到软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714993/

相关文章:

python - 从网站捕获视频流到文件中

python - while block 没有按预期循环

ubuntu - pip安装后找不到cget

python - 使用 Python 以编程方式检测 Windows XP 上的系统代理设置

python - Asyncio 循环等待事件

python - 使用 Pyparsing 根据 header 字段解析 CSV 数据

python - pip install missed setup.py

python - 无法在 macOS 上通过 pip 或 conda 安装 parquet "Big Sur"

python - 当我运行 setuptools .egg "as if it were a shell script"时,实际发生了什么?

python - 如何在 Mac OS X Tiger 上为 Python 2.7.1 安装 setuptools?