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

4 投票
3 回答
11926 浏览
提问于 2025-04-19 14:53

我需要解决一个问题,就是系统路径(sys.path)提供的分隔符和操作系统路径连接(os.path.join)使用的分隔符不一致。

我模仿了Esri的方法(分享Python脚本的技巧),想让我的脚本可以在不同环境中使用。目前它在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 folder: C:/gis\ToolData -- 很明显,混合使用斜杠是行不通的。

这个问题(Windows上os.path.join的混合斜杠)给出了一个解决方案的基本思路:

在把外部输入(你显然无法控制格式的输入)放入 os.path.join 之前,先检查一下。这可以确保 os.path.join 不会因为可能不好的输入而做出错误的决定。

不过,我不太确定如何确保它在不同平台上都能正常工作。如果我对 sys.path[0] 的结果使用 .replace("/","\\"),这在Windows上没问题,但一旦我转到Unix,这样做是不是又会引发同样的混合斜杠问题呢?

3 个回答

0

在Python中,有一个叫做os.sep的字符,它用来存储你操作系统喜欢的文件夹分隔符。你可以用这个字符手动连接字符串,试试看?

在Linux系统上:

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

https://docs.python.org/2/library/os.html#os.sep

2

阅读了文档并尝试了很多不同的方式之后:

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

7

你可以试试用 os.path.normpath() 这个方法。

>>> import os
>>> os.path.normpath(r'c:\my/path\to/something.py')
'c:\\my\\path\\to\\something.py'

还有一点值得注意的是:在Windows系统中,路径的API并不在乎你用的是正斜杠还是反斜杠。通常是程序没有正确处理斜杠的问题。例如,在Python中:

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

这样写是可以正常工作的。

撰写回答