Pythonには、変数base_dir
とがありfilename
ます。それらを連結して取得したいと思いfullpath
ます。しかし、Windowsの下\
では、POSIXに使用する必要があります/
。
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
このプラットフォームを独立させるにはどうすればよいですか?
Pythonには、変数base_dir
とがありfilename
ます。それらを連結して取得したいと思いfullpath
ます。しかし、Windowsの下\
では、POSIXに使用する必要があります/
。
fullpath = "%s/%s" % ( base_dir, filename ) # for Linux
このプラットフォームを独立させるにはどうすればよいですか?
回答:
これにはos.path.join()を使用します。
文字列の連結などではなくこれを使用することの強みは、パス区切り文字など、OS固有のさまざまな問題を認識していることです。例:
import os
以下の下でのWindows 7:
base_dir = r'c:\bla\bing'
filename = r'data.txt'
os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'
以下の下でのLinux:
base_dir = '/bla/bing'
filename = 'data.txt'
os.path.join(base_dir, filename)
'/bla/bing/data.txt'
OSのモジュールは、経由パスで使用されるセパレータとしてディレクトリ、パス操作とOSの特定の情報を見つけるための多くの有用な方法が含まos.sepを
base_dir
の相対パス(OPがそれを使用するにもかかわらず)である
abspath()
呼び出しを追加すると、相対的なものがある場合はフルパスになります。
ここで古い質問を掘り下げますが、Python 3.4以降ではpathlib演算子を使用できます:
from pathlib import Path
# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"
os.path.join()
幸運にも最近のバージョンのPythonを実行している場合よりも読みやすい可能性があります。ただし、たとえば、リジッド環境やレガシー環境でコードを実行する必要がある場合は、古いバージョンのPythonとの互換性もトレードオフになります。
pathlib
。ただし、Python2のインストールでは、デフォルトでインストールされないことがよくあります。ユーザーがpathlibのインストールも実行する必要がない場合os.path.join()
は、より簡単な方法です。
私はこれのためにヘルパークラスを作りました:
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
使用法は次のとおりです。
a = u("http://some/path")
b = a + "and/some/another/path" # http://some/path/and/some/another/path
これをありがとう。fbsまたはpyinstallerとフリーズしたアプリを使用してこれを見る他の人のために。
私は今完璧に動作する以下を使用することができます。
target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")
私は以前は明らかに理想的ではなかったこの不機嫌さをしていました。
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)