Python 解析sys.path和os.path.join中的混合斜杠

Python 解析sys.path和os.path.join中的混合斜杠,python,portability,arcpy,sys,Python,Portability,Arcpy,Sys,我需要解决sys.path提供的分隔符与os.path.join使用的分隔符之间的差异 我模仿了这个Esri方法()以使脚本可移植。它目前正在Windows中使用,但最终将在Linux服务器上使用;我需要让Python确定适当的斜杠 他们的建议是: # Get the pathname to this script scriptPath = sys.path[0] # Get the pathname to the ToolShare folder toolSharePath = os.pat

我需要解决sys.path提供的分隔符与os.path.join使用的分隔符之间的差异

我模仿了这个Esri方法()以使脚本可移植。它目前正在Windows中使用,但最终将在Linux服务器上使用;我需要让Python确定适当的斜杠

他们的建议是:

# Get the pathname to this script
scriptPath = sys.path[0]

# Get the pathname to the ToolShare folder
toolSharePath = os.path.dirname(scriptPath)

# Now construct pathname to the ToolData folder
toolDataPath = os.path.join(toolSharePath, "ToolData")
print "ToolData folder: " + toolDataPath
但这会输出
ToolData文件夹:C:/gis\ToolData
——显然混合斜杠不起作用

此问题()包括解决方案的基本方法:

在将外部输入放入
os.path.join
之前,请检查它(您显然不控制其格式的输入)。通过这种方式,您可以确保
os.path.join
不会基于可能错误的输入做出错误的决策


然而,我不确定如何确保它能够跨平台工作。如果我在
sys.path[0]
结果上使用
.replace(“/”,“\\”)
,这对Windows很好,但是一旦我转换到Unix,这不会导致同样的混合斜杠问题吗?

Python中有一个
os.sep
字符,它存储操作系统首选的文件夹分隔字符。也许你可以用它来执行一个手动字符串
join

在Linux上:

>>> import os
>>> os.sep
'/'

在尝试了许多变化之后:

os.path.abspath
函数可以“清除”斜杠,因此无论斜杠
sys.path[0]
决定使用哪个方向,斜杠都将替换为首选分隔符

scriptPath = sys.path[0]
toolDataPath = os.path.join(scriptPath, "ToolData")
结果:
C:/gis\ToolData

scriptPath = sys.path[0]
toolSharePath = os.path.abspath(scriptPath)
# or, in one line: toolSharePath = os.path.abspath(sys.path[0])
toolDataPath = os.path.join(toolSharePath, "ToolData")
结果:
C:\gis\ToolData

如何使用

scriptPath = sys.path[0]
toolSharePath = os.path.abspath(scriptPath)
# or, in one line: toolSharePath = os.path.abspath(sys.path[0])
toolDataPath = os.path.join(toolSharePath, "ToolData")
同样值得一提的是:Windows路径API并不关心是否使用前斜杠或后斜杠。通常是程序的错误没有正确处理斜杠。例如,在python中:

with open(r'c:/path/to/my/file.py') as f:
    print f.read()

将起作用。

问题在于
os.sep
(在Windows中,反斜杠)与
sys.path[0]
使用的内容(正斜杠)不匹配。它可能在Linux上运行(尚未选中),但我希望它能在任何一个平台上干净地运行?它在Python3.4中是新出现的,在Python2.7中不存在。我认为我一直使用Python2.7,因为我使用了一堆ArcPy函数(和/或我们在服务器上只有2.7)。Python可以对Windows路径使用正斜杠,所以
sys.path[0]。替换(r'\','/'))
可能是跨平台功能的最佳选择。请仔细阅读该文档:在大多数平台上,这相当于调用函数
normpath()
。。。。只需直接调用
os.path.normpath()
,除非还必须使路径为绝对路径。