Comme vous le dites, os.path.join
joint les chemins en fonction de l'OS actuel. posixpath
est le module sous-jacent utilisé sur les systèmes posix sous l'espace de noms os.path
:
>>> os.path.join is posixpath.join
True
>>> posixpath.join('/media/', 'js/foo.js')
'/media/js/foo.js'
Vous pouvez donc simplement importer et utiliser posixpath.join
à la place pour les urls, qui est disponible et fonctionnera sur toute plate-forme .
Editer : La suggestion de @Pete est bonne, vous pouvez aliaser l'importation pour améliorer la lisibilité.
from posixpath import join as urljoin
Editer : Je pense que cela est plus clair, ou du moins que cela m'a aidé à comprendre, si vous regardez la source de os.py
(le code ici est celui de Python 2.7.11, et j'en ai coupé quelques parties). Il y a des importations conditionnelles dans os.py
qui choisit le module de chemin à utiliser dans l'espace de noms os.path
. Tous les modules sous-jacents ( posixpath
, ntpath
, os2emxpath
, riscospath
) qui peuvent être importés dans les os.py
, alias path
sont là et existent pour être utilisés sur tous les systèmes. os.py
consiste simplement à choisir l'un des modules à utiliser dans l'espace de noms os.path
au moment de l'exécution en fonction du système d'exploitation actuel.
# os.py
import sys, errno
_names = sys.builtin_module_names
if 'posix' in _names:
# ...
from posix import *
# ...
import posixpath as path
# ...
elif 'nt' in _names:
# ...
from nt import *
# ...
import ntpath as path
# ...
elif 'os2' in _names:
# ...
from os2 import *
# ...
if sys.version.find('EMX GCC') == -1:
import ntpath as path
else:
import os2emxpath as path
from _emx_link import link
# ...
elif 'ce' in _names:
# ...
from ce import *
# ...
# We can use the standard Windows path.
import ntpath as path
elif 'riscos' in _names:
# ...
from riscos import *
# ...
import riscospath as path
# ...
else:
raise ImportError, 'no os specific module found'
2 votes
os.path.join
ne fonctionnera pas. Mais le simple fait d'adhérer à la/
devrait fonctionner dans tous les cas --/
est le séparateur de chemin standard dans HTTP, conformément à la spécification.