Python setuptools从Windows

时间:2015-07-25 17:49:33

标签: python setuptools

我正在尝试在Windows 7上安装包含setuptools console_scripts的软件包。我正在尝试将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

1 个答案:

答案 0 :(得分:6)

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

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

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

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