我正在尝试在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
答案 0 :(得分:6)
简短的回答是Windows在路径名中使用正斜杠不能正常工作 - 如文档here所述。避免使用这样的名称设置PYTHONUSERBASE环境变量。
较长的版本是setuptools直接或通过调用abs路径规范化其大多数路径名(在Windows版本的Python上转换为/)。但是,对于创建脚本时使用的目录名称,它不会这样做(请参阅this file中的write_script)。
因此,您会发现脚本与其他文件之间的行为不一致。修复是为了避免需要通过避免路径中的正斜杠来规范化文件。
如果您正在从配置文件中读取路径,然后使用它来设置PYTHONUSERBASE,只需使用os.path.normpath将Linux转换为Windows文件名。这在Linux上很好,因为它对斜杠没有影响。