Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setuptools正在从Windows上的路径参数中剥离斜杠_Python_Setuptools - Fatal编程技术网

Python setuptools正在从Windows上的路径参数中剥离斜杠

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

我正在尝试在Windows 7上安装一个带有
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,或者至少应该记录下来。。。