Python setuptools正在从Windows上的路径参数中删除斜杠

dar*_*ith 9 python setuptools

我正在尝试安装setuptools包含console_scripts在Windows 7上的软件包.我正在尝试将我的值更改PYTHONUSERBASE为安装到带有--user标志的自定义目录中.如果我在值中使用反斜杠PYTHONUSERBASE,如

set PYTHONUSERBASE=C:\testing
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,如果我使用正斜杠,就像在

set PYTHONUSERBASE=C:/testing
Run Code Online (Sandbox Code Playgroud)

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

|-- setup.py
|-- foobar\
|---- __init__.py
|---- __main__.py
Run Code Online (Sandbox Code Playgroud)

中的代码__main__.py

def main(): print('This is the main function')
Run Code Online (Sandbox Code Playgroud)

setup.py看起来像:

from setuptools import setup

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

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

Pet*_*ain 6

简短的回答是Windows在路径名中使用正斜杠不能正常工作 - 如此处所述.避免使用这样的名称设置PYTHONUSERBASE环境变量.

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

因此,您会看到脚本和其他文件之间的行为不一致.修复是为了避免需要通过避免路径中的正斜杠来规范化文件.

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

  • 我会说,可以说是`write_script()` 中的一个错误。很好的答案。 (2认同)