Setup.py 安装需要本地包

Setup.py install requires local package

我正在使用 setuptools 安装软件包 my-packagemy-package 具有本地依赖项 utils。我的文件结构如下:

parent/
    my-package/
        my-package/
        setup.py
    utils/
        utils/
        setup.py

我希望使用以下方法安装本地依赖项:

from setuptools import setup
import os

setup(
    name='my-package',
    version='1.0',
    packages=['my-package'],
    install_requires=[
        # location to your my-package project directory
        "file:\" + os.path.join(os.path.dirname(os.getcwd()), 'utils#egg=utils-1.0')
    ]
)

不幸的是,出现以下错误:

    ERROR: Command errored out with exit status 1:
     command: /path/to/python/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/home/my-package/setup.py'"'"'; __file__='"'"'/home/my-package/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info
         cwd: /home/my-package/
    Complete output (1 lines):
    error in my-package setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Invalid requirement, parse error at "'://home/'"
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

我已经尝试了 的解决方案,但没有成功。非常感谢任何帮助。

dependency_links 已弃用。这是一个丑陋的 hack,一个非常糟糕的做法。我不建议你这样做。

此 hack 旨在安装为 python setup.py install,现在也已弃用。如果您使用 pip 安装,那么很可能这将不起作用。

一般来说,相对路径依赖在Python打包中总是一个坏主意,我建议你用不同的方式解决它。

话虽如此,像这样的事情可能会奏效,或者至少在过去的某个时候可能会奏效:

.
├── One
│   ├── one
│   │   └── __init__.py
│   └── setup.py
└── Two
    ├── setup.py
    └── two
        └── __init__.py

One/setup.py

#!/usr/bin/env python3

import setuptools
import pathlib

TWO_PATH = pathlib.Path(__file__).resolve().parent.parent.joinpath('Two')

setuptools.setup(
    name='One',
    version='1.2.3',
    packages=['one'],
    install_requires=['Two'],
    dependency_links=[
        'file://{}#egg=Two-1.2.3'.format(TWO_PATH),
    ],
)