Resolving mixed slashes from sys.path and os.path.join

Erica picture Erica · Sep 3, 2014 · Viewed 7.1k times · Source

I need to resolve a disparity between the separator that sys.path is providing, and the separator that os.path.join is using.

I mimicked this Esri method (Techniques for sharing Python scripts) to make my script portable. It is being used in Windows for now, but will eventually live on a Linux server; I need to let Python determine the appropriate slash.

What they suggest:

# 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

But this outputs ToolData folder: C:/gis\ToolData -- and obviously the mixed slashes aren't going to work.

This Question (mixed slashes with os.path.join on windows) includes the basic approach to a solution:

check your external input (the input you apparently do not control the format of) before putting it in os.path.join. This way you make sure that os.path.join does not make bad decisions based on possibly bad input

However, I'm unsure how to ensure that it will work cross-platform. If I use .replace("/","\\") on the sys.path[0] result, that's great for Windows, but isn't that going to cause the same mixed-slash problem once I transition to Unix?

Answer

OozeMeister picture OozeMeister · Sep 5, 2014

How about using os.path.normpath()?

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

Also worth mentioning: the Windows path API doesn't care whether forward or back slashes are used. Usually it's the fault of program that doesn't handle the slashing properly. For example, in python:

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

will work.