W Pythonie mam zmienne base_dir
i filename
. Chciałbym je połączyć, aby uzyskać fullpath
. Ale pod Windows powinienem używać \
i dla POSIX /
.
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
Jak mogę uczynić tę platformę niezależną?
W Pythonie mam zmienne base_dir
i filename
. Chciałbym je połączyć, aby uzyskać fullpath
. Ale pod Windows powinienem używać \
i dla POSIX /
.
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
Jak mogę uczynić tę platformę niezależną?
Odpowiedzi:
Chcesz użyć do tego os.path.join () .
Zaletą używania tego zamiast łączenia ciągów itp. Jest świadomość różnych problemów specyficznych dla systemu operacyjnego, takich jak separatory ścieżek. Przykłady:
import os
W systemie Windows 7 :
base_dir = r'c:\bla\bing'
filename = r'data.txt'
os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'
W systemie Linux :
base_dir = '/bla/bing'
filename = 'data.txt'
os.path.join(base_dir, filename)
'/bla/bing/data.txt'
Os moduł zawiera wiele użytecznych metod manipulacji ścieżkę katalogu, a znalezienie się informacje dotyczące konkretnego systemu operacyjnego, takich jak separator używany w ścieżkach poprzez os.sep
Zastosowanie os.path.join()
:
import os
fullpath = os.path.join(base_dir, filename)
Os.path moduł zawiera wszystkie metody powinny potrzebnych dla platformy niezależnej manipulacji ścieżki, ale w przypadku trzeba wiedzieć, co jest separator ścieżki na bieżącej platformie można wykorzystać os.sep
.
base_dir
jest to ścieżka względna (pomimo że OP jej używa)
abspath()
wywołania powinno nadać mu pełną ścieżkę, jeśli jest w niej coś względnego.
Wykopując tutaj stare pytanie, ale w Pythonie 3.4+ możesz użyć operatorów pathlib :
from pathlib import Path
# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"
Jest potencjalnie bardziej czytelny, niż os.path.join()
gdybyś miał tyle szczęścia, że używa najnowszej wersji Pythona. Jeśli jednak musisz uruchomić kod w, powiedzmy, środowisku sztywnym lub starszym, rezygnujesz również z kompatybilności ze starszymi wersjami Pythona.
pathlib
. Jednak często nie jest instalowany domyślnie w instalacjach Python2. Jeśli nie chcesz, aby użytkownicy również musieli instalować pathlib, os.path.join()
jest to prostsza droga.
Zrobiłem dla tego klasę pomocniczą:
import os
class u(str):
"""
Class to deal with urls concat.
"""
def __init__(self, url):
self.url = str(url)
def __add__(self, other):
if isinstance(other, u):
return u(os.path.join(self.url, other.url))
else:
return u(os.path.join(self.url, other))
def __unicode__(self):
return self.url
def __repr__(self):
return self.url
Zastosowanie to:
a = u("http://some/path")
b = a + "and/some/another/path" # http://some/path/and/some/another/path
Dzięki za to. Dla każdego, kto widzi to przy użyciu fbs lub pyinstaller i zamrożonych aplikacji.
Mogę skorzystać z poniższego, który teraz działa idealnie.
target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")
Robiłem tę głupotę, która wcześniej oczywiście nie była idealna.
if platform == 'Windows':
target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")
if platform == 'Linux' or 'MAC':
target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + "sqlite_example.db")
target_db_path = target_db
print(target_db_path)