Python setuptools正在从Windows上的路径参数中剥离斜杠
我正在尝试在Windows 7上安装一个带有Python setuptools正在从Windows上的路径参数中剥离斜杠,python,setuptools,Python,Setuptools,我正在尝试在Windows 7上安装一个带有setuptools的软件包,其中包括console\u脚本。我正在尝试更改我的PYTHONUSERBASE的值,以便安装到带有--user标志的自定义目录中。如果我在PYTHONUSERBASE的值中使用反斜杠,如 set PYTHONUSERBASE=C:\testing 一切正常。但是,如果我使用正斜杠,如 set PYTHONUSERBASE=C:/testing 软件包本身安装到正确的位置,但是控制台脚本(并且只有控制台脚本)安装到C:t
setuptools
的软件包,其中包括console\u脚本。我正在尝试更改我的PYTHONUSERBASE
的值,以便安装到带有--user
标志的自定义目录中。如果我在PYTHONUSERBASE
的值中使用反斜杠,如
set PYTHONUSERBASE=C:\testing
一切正常。但是,如果我使用正斜杠,如
set PYTHONUSERBASE=C:/testing
软件包本身安装到正确的位置,但是控制台脚本
(并且只有控制台脚本
)安装到C:testing\scripts
。显然,当存在正斜杠时,setuptools
仅将控制台脚本的路径视为相对路径。在我真正的包中,我从配置文件中读取值,因此我真的不想处理路径分隔符的规范化问题,因为它也需要在Linux上工作。对于测试,我有一个具有以下结构的包
|-- setup.py
|-- foobar\
|---- __init__.py
|---- __main__.py
\uuuu main\uuuu.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
要去掉路径中的第一个正斜杠,如何修复它?我认为这个问题与我的问题有关,但我不认为它解决了这个问题:简单的回答是Windows不能很好地使用路径名中的正向斜杠-如文档所述。避免使用这样的名称设置PYTHONUSERBASE环境变量
更长的版本是,setuptools直接或通过调用abs path来规范其大多数路径名(在Python的Windows版本上转换为\)。但是,对于创建脚本时使用的目录名,它不会这样做(请参见中的“编写脚本”)
因此,您会看到脚本和其他文件之间的行为不一致。修复方法是通过避免路径中的前斜杠来避免需要规范化文件
如果从配置文件读取路径,然后使用该路径设置PYTHONUSERBASE,只需使用os.path.normpath将Linux文件名转换为Windows文件名即可。这在Linux上很好,因为它对斜杠没有影响。我不知道为什么setuptools会这样做,但是如果os.environ:os.environ['PYTHONUSERBASE']=os.environ['PYTHONUSERBASE'].替换('/',os.sep'),您可能可以在安装函数中执行类似于的操作
@PatrickMaupin我在想这样的事情。。。我实际上使用了SCON来构建真正的项目,所以我试着看看是否可以在SConstruct文件中处理它。我认为最好使用os.path.normpath
而不是显式地替换斜杠。谢谢这是一个计划。我忘了normpath()会这样做,因为它是windows特有的行为(在linux上,它不会将反斜杠更改为斜杠),而且我不使用windows。祝你好运可以说是write_script()
中的一个bug。回答得好,谢谢!这就是我最终的结果,使用normpath
来解决问题。不过,我同意@JRichardSnape的说法,这似乎是write\u script()
中的一个bug,或者至少应该记录下来。。。