Kami sedang bekerja dengan repositori kode yang digunakan untuk Windows dan Linux - terkadang di direktori yang berbeda. Bagaimana seharusnya salah satu modul di dalam proyek merujuk ke salah satu sumber daya non-Python dalam proyek (file CSV, dll.)?
Jika kita melakukan sesuatu seperti:
thefile=open('test.csv')
atau:
thefile=open('../somedirectory/test.csv')
Ini akan berfungsi hanya ketika skrip dijalankan dari satu direktori tertentu, atau bagian dari direktori.
Yang ingin saya lakukan adalah sesuatu seperti:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Apa itu mungkin?
python
path
relative-path
olamundo
sumber
sumber
__file__
), '..', '..', 'resources')os.pardir
sedikit lebih baik daripada'..'
, meskipun keduanya setara pada POSIX dan Windows.Jika Anda menggunakan alat setup atau mendistribusikan (instalasi setup.py) maka cara "benar" untuk mengakses sumber daya paket ini tampaknya menggunakan package_resources.
Dalam kasus Anda, contohnya adalah
Yang tentu saja membaca sumber daya dan data biner baca akan menjadi nilai my_data
Jika Anda hanya membutuhkan nama file, Anda juga dapat menggunakan
Contoh:
Keuntungannya adalah dijamin bekerja meskipun itu adalah distribusi arsip seperti telur.
Lihat http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
sumber
__file__
seperti masa lalu yang indah?Dalam Python, path relatif terhadap direktori kerja saat ini , yang dalam banyak kasus adalah direktori tempat Anda menjalankan program Anda. The direktori kerja saat ini ini sangat mungkin tidak sama dengan direktori file modul Anda, sehingga menggunakan path relatif ke file modul Anda saat ini selalu pilihan yang buruk.
Menggunakan jalur absolut harus menjadi solusi terbaik:
sumber
Saya sering menggunakan sesuatu yang mirip dengan ini:
Variabel
menyimpan nama file skrip tempat Anda menulis kode itu, sehingga Anda dapat membuat jalur relatif ke skrip, tetapi masih ditulis dengan jalur absolut. Ini bekerja cukup baik karena beberapa alasan:
Tetapi Anda perlu memperhatikan kompatibilitas platform - os.pathsep Windows berbeda dari UNIX.
sumber
Anda juga mencoba untuk menormalkan
cwd
penggunaan Andaos.path.abspath(os.getcwd())
. Info lebih lanjut di sini .sumber
cwd
jalur modul,Anda bisa menggunakan
__file__
variabel build in . Ini berisi jalur file saat ini. Saya akan mengimplementasikan getBaseOfProject dalam sebuah modul di root proyek Anda. Di sana saya akan mendapatkan bagian jalur__file__
dan akan mengembalikannya. Metode ini kemudian dapat digunakan di mana saja dalam proyek Anda.sumber
Saya sedikit bingung di sini. Ingin mengemas beberapa file sumber daya ke file roda dan mengaksesnya. Apakah kemasan menggunakan file manifes, tetapi pemasangan pip tidak menginstalnya kecuali itu adalah sub direktori. Berharap tembakan-tembakan sceen ini akan membantu
MANIFEST.in
Membuat weel menggunakan setup.py standar. pip menginstal file roda. Setelah instalasi diperiksa apakah sumber daya diinstal. Mereka
Di tfclient.py untuk mengakses file-file ini. dari
Dan itu berhasil.
sumber
Saya menghabiskan waktu yang lama untuk mencari tahu jawabannya, tetapi akhirnya saya mendapatkannya (dan sebenarnya sangat sederhana):
Ini akan menambahkan path relatif dari subfolder Anda ke direktori untuk python untuk melihatnya. Ini cukup cepat dan kotor, tetapi bekerja seperti pesona :)
sumber
open('your/subfolder/of/choice')
.