【问题标题】:Python setuptools is stripping slashes from path arguments on WindowsPython setuptools 正在从 Windows 上的路径参数中删除斜杠
【发布时间】:2015-10-16 05:45:38
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 我不知道为什么 setuptools 会这样做,但你也许可以在你的 setup 函数中做一些事情,比如if 'PYTHONUSERBASE' in os.environ: os.environ['PYTHONUSERBASE'] = os.environ['PYTHONUSERBASE'].replace('/', os.sep)
  • @PatrickMaupin 我正在考虑类似的事情......我实际上使用 SCons 来构建真正的项目,所以我试图看看我是否也可以在 SConstruct 文件中处理它。我认为使用os.path.normpath 可能会更好,而不是明确替换斜线。谢谢!
  • 这是一个计划。我忘记 normpath() 会这样做,因为它是特定于 Windows 的行为(在 Linux 上,它不会将反斜杠更改为斜杠)而且我不使用 Windows。祝你好运!

标签: python setuptools


【解决方案1】:

简短的回答是,Windows 不能很好地使用路径名中的正斜杠 - 正如 here 所记录的那样。避免使用这样的名称设置 PYTHONUSERBASE 环境变量。

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

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

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

【讨论】:

  • 我想说的是write_script() 中的一个错误。很好的答案。
  • 谢谢!这几乎就是我最终的结果,使用normpath 来解决问题。不过,我同意@JRichardSnape 的观点,这似乎是write_script() 中的一个错误,或者至少应该记录在案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2020-11-25
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多