Python setuptools 正在从 Windows 上的路径参数中去除斜线

Python setuptools is stripping slashes from path arguments on Windows

我正在尝试安装 setuptools 的软件包,其中包括 Windows 上的 console_scripts 7。我正在尝试更改 PYTHONUSERBASE 的值以安装进入带有 --user 标志的自定义目录。如果我在 PYTHONUSERBASE 的值中使用反斜杠,如

set PYTHONUSERBASE=C:\testing

一切正常。但是,如果我使用正斜杠,如

set PYTHONUSERBASE=C:/testing

包本身安装到正确的位置,但是 console_scripts(并且只有 console_scripts)安装到 C:testing\Scripts。显然,当存在正斜杠时,setuptools 将路径视为仅针对 console_scripts 的相对路径 。在我的真实包中,我正在从配置文件中读取值,所以我真的不想处理路径分隔符的规范化,因为它也需要在 Linux 上工作。为了测试,我有一个结构为

的包
|-- setup.py
|-- foobar\
|---- __init__.py
|---- __main__.py

__main__.py中的代码是

def main(): print('This is the main function')

setup.py 看起来像:

from setuptools import setup

setup(
    name='foobar',
    version='1.0.0',
    packages=['foobar'],
    entry_points={
        'console_scripts': [
            'foobar=foobar.__main__:main',
        ],
    },
)

为什么 setuptools 删除了路径中的第一个正斜杠,我该如何解决?我认为这个问题与我的问题有关,但我认为它没有解决问题:Python os.path.join on Windows

简短的回答是 Windows 不能很好地与路径名中的正斜杠一起使用 - 如文档 here 所示。避免使用这样的名称设置 PYTHONUSERBASE 环境变量。

较长的版本是 setuptools 直接或通过调用 abs 路径规范化其大部分路径名(在 Python 的 Windows 版本上将 / 转换为 \)。但是,它不会为创建脚本时使用的目录名称这样做(请参阅 this file 中的 write_script)。

因此您看到脚本和其他文件之间的行为不一致。解决方法是通过避免路径中的正斜杠来避免需要规范化文件。

如果您从配置文件中读取路径,然后使用它来设置 PYTHONUSERBASE,只需使用 os.path.normpath 将文件名从 Linux 转换为 Windows。这在 Linux 上没问题,因为它对斜杠没有影响。