Impor modul dari jalur relatif

759

Bagaimana cara mengimpor modul Python yang diberikan jalur relatifnya?

Sebagai contoh, jika dirFoomengandung Foo.pydan dirBar, dan dirBarmengandung Bar.py, bagaimana cara mengimpor Bar.pyke Foo.py?

Berikut ini adalah representasi visual:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Fooingin menyertakan Bar, tetapi merestrukturisasi hierarki folder bukanlah suatu opsi.

Jude Allred
sumber
2
Sepertinya stackoverflow.com/questions/72852/… , mungkin?
Joril
3
Periksa jawaban saya, ini yang paling lengkap sejauh ini, yang lain tidak bekerja dalam kasus khusus, misalnya ketika Anda memanggil skrip dari direktori lain atau dari skrip python lain. Lihat stackoverflow.com/questions/279237/…
sorin
Saya memiliki masalah yang sama dan saya menemukan ini dan itu berhasil !! apt-get install python-profiler
ldcl289
5
Hanya dalam kasus seseorang ingin melakukannya secara statis dan tiba di sini (seperti yang saya lakukan :) Anda juga dapat mengatur variabel lingkungan PYTHONPATH
okaram
Lebih baik mengikuti petunjuk di Lib / site.py untuk setiap kasus
Avenida Gez

Jawaban:

333

Dengan asumsi bahwa kedua direktori Anda adalah paket Python sungguhan (memiliki __init__.pyfile di dalamnya), berikut adalah solusi aman untuk penyertaan modul relatif ke lokasi skrip.

Saya berasumsi bahwa Anda ingin melakukan ini, karena Anda perlu menyertakan satu set modul dengan skrip Anda. Saya menggunakan ini dalam produksi di beberapa produk dan bekerja di banyak skenario khusus seperti: skrip dipanggil dari direktori lain atau dieksekusi dengan python mengeksekusi alih-alih membuka juru bahasa baru.

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

Sebagai bonus, pendekatan ini memungkinkan Anda memaksa Python untuk menggunakan modul Anda, bukan yang diinstal pada sistem.

Peringatan! Saya tidak benar-benar tahu apa yang terjadi ketika modul saat ini ada di dalam eggfile. Mungkin gagal juga.

Sorin
sumber
5
dapatkah saya mendapatkan penjelasan tentang bagaimana ini bekerja? Saya punya masalah yang sama dan saya akan MENYUKAI untuk memaksa modul python DIR daripada menjalankan pencarian
carl crott
Menjalankan Win 7 Pro 64x dan Python 2.7 Saya mendapatkan beberapa kesalahan. 1) Saya harus menambahkan memeriksa ke daftar impor. 2) Nilai pertama, [0], dalam tupel adalah string kosong. Yang ke-2, [1], menunjukkan nama file. Saya menduga bahwa yang pertama harus menjadi jalan ... Ada ide?
Adam Lewis
2
Jika Anda akan untuk subfolder, menggunakannya seperti ini: os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]) + "/subfolder")Do NOT menambahkan subfolder sebelum abspathkarena hal ini menyebabkan bug serius.
Maximilian Hils
4
@ scr4ve Anda harus menggunakan os.path.join (), dan Anda dipersilakan untuk menambahkan case ( cmd_subfolder) langsung ke jawaban saya. Terima kasih!
sorin
7
bagi saya realpathsudah menghasilkan jalur absolut, jadi saya tidak perlu abspath. Juga os.path.dirnamedapat digunakan sebagai pengganti split, membuat pengindeksan [0]menjadi usang. Barisnya adalah:os.path.realpath(os.path.dirname(inspect.getfile(inspect.currentframe())))
ted
328

Pastikan dirBar memiliki __init__.pyfile - ini membuat direktori menjadi paket Python.

S.Lott
sumber
204
Perhatikan bahwa file ini dapat sepenuhnya kosong.
Harley Holcombe
47
Jika direktori induk dirBar adalah tidak sys.pathmaka kehadiran __init__.pydi dirBardirektori tidak banyak membantu.
jfs
7
-1, menambahkan __init.py__hanya akan berfungsi ketika direktori sudah ada di sys.path dan dalam kasus saya tidak. Solusi oleh "sorin" (diterima) selalu bekerja.
Czarek Tomczak
12
+ msgstr "ketika direktori sudah ada di sys.path". Meskipun sepenuhnya benar, bagaimana kita dapat menebak bahwa direktori tersebut tidak ada dalam sys.pathpertanyaan? Mungkin ada sesuatu yang dihilangkan yang tidak kita lihat atau ketahui?
S.Lott
4
Ini TIDAK berarti jawaban atas pertanyaan: apakah ada file inisialisasi atau tidak, ini tidak membuat python melihat ke dalam sub-direktori. Bagaimana cara mendapatkan ratusan upvotes?
gented
261

Anda juga bisa menambahkan subdirektori ke jalur Python Anda sehingga impor sebagai skrip normal.

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar
Andrew Cox
sumber
6
Tampaknya jawaban Anda tidak berfungsi dengan jalur relatif, lihat stackoverflow.com/questions/279237/…
bogdan
24
Ini tidak bekerja dengan path relatif - Anda hanya perlu memahami bahwa path relatif akan tergantung pada apa direktori Anda menjalankan dari, yang membuat ini solusi miskin untuk apa saja selain hack cepat.
Nobar
12
Anda dapat melakukan sesuatu sepertisys.path.append(os.path.dirname(__file__) + "/relative/path/to/module")
Falko
atausys.path.append(__name__ if __name__ != '__main__' else __loader__.fullname)
vim
1
Pertimbangkan untuk menggunakannya sys.path.insert(0, <path to dirFoo>)karena akan memuat modul ini sebelum modul dengan nama yang sama disimpan di tempat lain.
Anton Tarasenko
117
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule
lefakir
sumber
2
Saya suka ini karena Anda memiliki fleksibilitas untuk naik direktori.
Charles L.
21
Anda harus menggunakan os.path.join()alih-alih bergabung dengan '/', yang akan merusak jendela (lumpuh).
0xc0de
18
Ini tidak bisa diandalkan. Itu tergantung pada apa pun direktori kerja saat ini, bukan pada direktori tempat skrip hidup.
jamesdlin
Mungkin hanya ingin menambahkan jika jalur belum ada di jalur. lib_path = os.path.abspath ('../ functions') jika lib_path tidak di sys.path: sys.path.append (lib_path)
Brent
sebagai balasan dari @jamesdlin yang menggabungkan beberapa jawaban: bagaimana os.path.abspath(os.path.join(__file__,'..','lib'))?
Matthew Davis
107

Lakukan saja hal-hal sederhana untuk mengimpor file .py dari folder yang berbeda.

Katakanlah Anda memiliki direktori seperti:

lib/abc.py

Kemudian simpan saja file kosong di folder lib seperti namanya

__init__.py

Dan kemudian gunakan

from lib.abc import <Your Module name>

Simpan __init__.pyfile di setiap folder hierarki modul impor.

Deepak 'Kaseriya'
sumber
79

Jika Anda menyusun proyek Anda dengan cara ini:

src\
  __init__.py
  main.py
  dirFoo\
    __init__.py
    Foo.py
  dirBar\
    __init__.py
    Bar.py

Maka dari Foo.py Anda harus dapat melakukan:

import dirFoo.Foo

Atau:

from dirFoo.Foo import FooObject

Per komentar Tom, ini mengharuskan srcfolder dapat diakses melalui site_packagesjalur pencarian Anda. Juga, seperti yang ia sebutkan, __init__.pysecara implisit diimpor ketika Anda pertama kali mengimpor modul dalam paket / direktori tersebut. Biasanya __init__.pyhanyalah file kosong.

bouvard
sumber
Juga sebutkan bahwa init .py diimpor ketika modul pertama di dalam paket itu diimpor. Juga, contoh Anda hanya akan berfungsi jika src ada di site_packages (atau di jalur pencarian)
Tom Leys
3
Ini adalah solusi paling sederhana yang saya cari. Jika file yang akan diimpor pasti berada di salah satu subdirektori, solusi ini adalah gem.
Deepak GM
Saya sudah mencoba hal yang sama dan gagal. Saya tidak tahu kenapa. ImportError: Tidak ada modul bernama customMath
Ming Li
9
Mengapa seseorang ingin mengimpor Foo dari dalam Foo.py sendiri. Harus dari Bar.py, kurasa.
bhaskarc
from dirFoo import Foountuk mengatakan Foo.bla(). Jika menggunakan import dirFoo.Foosatu harus menggunakan dirFoo.Foo.bla()- cukup jelek bahkan tanpa kasing unta.
Cees Timmerman
45

Metode termudah adalah dengan menggunakan sys.path.append ().

Namun, Anda mungkin juga tertarik dengan modul imp . Ini menyediakan akses ke fungsi impor internal.

# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file 

Ini dapat digunakan untuk memuat modul secara dinamis ketika Anda tidak tahu nama modul.

Saya telah menggunakan ini di masa lalu untuk membuat antarmuka jenis plugin ke aplikasi, di mana pengguna akan menulis skrip dengan fungsi spesifik aplikasi, dan hanya meletakkan skrip mereka di direktori tertentu.

Juga, fungsi-fungsi ini mungkin berguna:

imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)
monkut
sumber
Perhatikan bahwa dalam dokumentasi imp.load_source dan imp.load_compiled terdaftar sebagai usang. imp.find_module dan imp.load_module direkomendasikan sebagai gantinya.
amicitas
@amicitas, Dapatkah Anda memberikan referensi untuk itu (saya membutuhkannya, dan saya menggunakan python 2.6. Saya tahu apa yang dikatakan 2,7 dokumen tentang ini, tetapi tidak dapat menemukan referensi mengenai 2.6)
0xc0de
@ 0xc0de Anda dapat menemukan pernyataan itu di dokumen untuk modul imp untuk python 2.7.3 dan python 2.6.7 . Sepertinya fungsi-fungsi itu bahkan tidak ada dalam dokumen untuk python 3.2.
amicitas
1
Untuk mengimpor file sumber seperti ini di python 3.3, lihat Mengimpor file sumber python abitrary. (Python 3.3+) - Stack Overflow . Terima kasih, teman-teman untuk tipsnya di sini.
nealmcb
44

Ini adalah PEP yang relevan:

http://www.python.org/dev/peps/pep-0328/

Secara khusus, anggap dirFoo adalah direktori naik dari dirBar ...

Di dirFoo \ Foo.py:

from ..dirBar import Bar
Peter Crabtree
sumber
itu bekerja untuk saya, baru saja menambahkan init .py pada setiap folder dan berhasil mengimpor
yussan
23

Cara termudah tanpa modifikasi pada skrip Anda adalah dengan menetapkan variabel lingkungan PYTHONPATH. Karena sys.path diinisialisasi dari lokasi-lokasi ini:

  1. Direktori yang berisi skrip input (atau direktori saat ini).
  2. PYTHONPATH (daftar nama direktori, dengan sintaksis yang sama dengan PATH variabel shell).
  3. Default yang bergantung pada instalasi.

Lari saja:

export PYTHONPATH=/absolute/path/to/your/module

Anda sys.path akan berisi jalur di atas, seperti yang ditunjukkan di bawah ini:

print sys.path

['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
James Gan
sumber
13

Menurut pendapat saya pilihan terbaik adalah meletakkan __ init __.py di folder dan memanggil file

from dirBar.Bar import *

Tidak disarankan untuk menggunakan sys.path.append () karena ada sesuatu yang salah jika Anda menggunakan nama file yang sama dengan paket python yang ada. Saya belum mengujinya tetapi itu akan ambigu.

jhana
sumber
aneh yang from dirBar.Bar import *berhasil, tetapi tidak from dirBar.Bar import Bar. apakah kamu tahu mengapa * bekerja? bagaimana jika saya mempunyai banyak file di dirBar / dan hanya ingin mengambil beberapa saja (menggunakan metode seperti yang Anda posting di sini)?
tester
2
@tester: Gunakan from dirBar import Bar.
Nobar
@tester itu karena frommenunjukkan sumber, dan segala sesuatu setelahnya importadalah apa yang harus diambil dari sumber itu. from dirBar.Bar import Barberarti "Dari sumber, impor sumber itu sendiri", yang tidak masuk akal. yang *meskipun berarti, "memberi saya segalanya dari sumber"
FuriousFolder
11

Cara cepat dan kotor untuk pengguna Linux

Jika Anda hanya bermain-main dan tidak peduli tentang masalah penyebaran, Anda dapat menggunakan tautan simbolis (dengan asumsi sistem file Anda mendukungnya) untuk membuat modul atau paket langsung terlihat di folder modul yang diminta.

ln -s (path)/module_name.py

atau

ln -s (path)/package_name

Catatan: "modul" adalah file apa pun dengan ekstensi .py dan "paket" adalah folder apa pun yang berisi file tersebut __init__.py(yang bisa berupa file kosong). Dari sudut pandang penggunaan, modul dan paket identik - keduanya mengekspos "definisi dan pernyataan" yang terkandung seperti yang diminta melalui importperintah.

Lihat: http://docs.python.org/2/tutorial/modules.html

bangsawan
sumber
10
from .dirBar import Bar

dari pada:

from dirBar import Bar

kalau-kalau ada dirBar lain yang diinstal dan membingungkan pembaca foo.py.

jgomo3
sumber
2
Saya tidak dapat melakukan ini di windows. Apakah ini di Linux?
Gabriel
1
Ini akan bekerja dari skrip yang mengimpor Foo. yaitu: main.py mengimpor dirFoo.Foo. Jika Anda mencoba menjalankan Foo.py sebagai skrip, itu akan Gagal. Lihat stackoverflow.com/questions/72852/…
jgomo3
9

Untuk kasus ini untuk mengimpor Bar.py ke Foo.py, pertama saya akan mengubah folder ini menjadi paket Python seperti:

dirFoo\
    __init__.py
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Maka saya akan melakukannya seperti ini di Foo.py:

from .dirBar import Bar

Jika saya ingin namespacing terlihat seperti Bar. terserah , atau

from . import dirBar

Jika saya ingin namespacing dirBar.Bar. terserahlah . Kasing kedua ini berguna jika Anda memiliki lebih banyak modul di bawah paket dirBar.

Al Conrad
sumber
7

Tambahkan file __init__.py :

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Kemudian tambahkan kode ini ke awal Foo.py:

import sys
sys.path.append('dirBar')
import Bar
Josh
sumber
5
Jika dirBarsudah merupakan paket Python (dengan adanya dirBar/__init__.py), tidak perlu untuk menambahkan dirBarke sys.path, tidak ada? Pernyataan import Bardari Foo.pyharus cukup.
Santa
5

Contoh sys.path relatif:

# /lib/my_module.py
# /src/test.py


if __name__ == '__main__' and __package__ is None:
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module

Berdasarkan jawaban ini .

Der_Meister
sumber
5

Nah, seperti yang Anda sebutkan, biasanya Anda ingin memiliki akses ke folder dengan modul Anda relatif ke tempat skrip utama Anda dijalankan, sehingga Anda hanya mengimpornya.

Larutan:

Saya memiliki skrip D:/Books/MyBooks.pydan beberapa modul (seperti oldies.py). Saya perlu mengimpor dari subdirektori D:/Books/includes:

import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path)  # Just verify it is there
import oldies

Tempatkan print('done')di oldies.py, jadi Anda memverifikasi semuanya berjalan OK. Cara ini selalu berhasil karena menurut definisi Python sys.pathseperti diinisialisasi pada saat startup program, item pertama dari daftar ini,path[0] , adalah direktori yang berisi skrip yang digunakan untuk memanggil juru bahasa Python.

Jika direktori skrip tidak tersedia (mis. Jika penerjemah dipanggil secara interaktif atau jika skrip dibaca dari input standar), path[0]adalah string kosong, yang mengarahkan Python untuk mencari modul dalam direktori saat ini terlebih dahulu. Perhatikan bahwa direktori skrip dimasukkan sebelum entri dimasukkan sebagai akibat dari PYTHONPATH.

Avenida Gez
sumber
1
Saya harus menggunakan satu garis miring bukan dua garis miring terbalik (yaitu site.addsitedir(sys.path[0]+'/includes')) dalam program Python sederhana saya break_time.py: https://github.com/ltfschoen/PythonTest . Saya menggunakan sistem: MacOS v10.11.5, Python 2.7.12, IDLE IDE 2.7.12, Tk 8.5.9
Luke Schoen
4

Cukup Anda bisa menggunakan: from Desktop.filename import something

Contoh:

mengingat bahwa file tersebut adalah nama test.pydalam direktori Users/user/Desktop, dan akan mengimpor semua.

Kode:

from Desktop.test import *

Tetapi pastikan Anda membuat file kosong bernama " __init__.py" di direktori itu

0x1996
sumber
1
Impor berbintang disarankan untuk ditolak. lihat: stackoverflow.com/questions/2386714/why-is-import-bad
axolotl
saya tahu itu sebabnya saya pertama menulis import something kemudian saya katakan untuk membuatnya lebih mudah * pada dasarnya itu tidak baik untuk ram dan juga jika 2 fungsi memiliki nama yang sama itu akan menambah kode Anda
0x1996
3

Solusi lain adalah dengan menginstal paket py-butuhkan dan kemudian gunakan yang berikut diFoo.py

import require
Bar = require('./dirBar/Bar')
Niklas R
sumber
URL sebenarnya tampaknya pypi.org/project/require.py , dan perhatikan bahwa itu perlu diinstal melalui Pip.
Flash Sheridan
1
@ FlashSheridan Tidak, itu proyek yang berbeda. Saya menghapus py-need karena saya yakin tidak ada yang menggunakannya, saya tidak memikirkan posting ini. Jika Anda masih membutuhkan require()fungsi, Anda dapat melihat proyek Node.py saya: github.com/nodepy/nodepy
Niklas R
2

Berikut cara mengimpor file dari satu tingkat di atas, menggunakan jalur relatif.

Pada dasarnya, cukup pindahkan direktori kerja ke atas (atau lokasi relatif apa pun), tambahkan itu ke jalur Anda, lalu pindahkan direktori kerja kembali ke tempat awalnya.

#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path =  os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)
Justin Muller
sumber
1
Saya tidak mengerti logika Anda di sini. itu terlalu rumit
transilvlad
0

Saya tidak berpengalaman tentang python, jadi jika ada yang salah dengan kata-kata saya, katakan saja. Jika hierarki file Anda diatur seperti ini:

project\
    module_1.py 
    module_2.py

module_1.pymendefinisikan fungsi yang disebut func_1(), module_2.py :

from module_1 import func_1

def func_2():
    func_1()

if __name__ == '__main__':
    func_2()

dan Anda menjalankan python module_2.pydalam cmd, itu akan menjalankan apa yang func_1()mendefinisikan. Biasanya itulah cara kami mengimpor file hierarki yang sama. Tetapi ketika Anda menulis from .module_1 import func_1di module_2.py, python interpreter akan mengatakan No module named '__main__.module_1'; '__main__' is not a package. Jadi untuk memperbaikinya, kita hanya menyimpan perubahan yang baru saja kita buat, dan memindahkan kedua modul ke sebuah paket, dan menjadikan modul ketiga sebagai penelepon untuk dijalankan module_2.py.

project\
    package_1\
        module_1.py
        module_2.py
    main.py

main.py :

from package_1.module_2 import func_2

def func_3():
    func_2()

if __name__ == '__main__':
    func_3()

Tapi alasan kita menambahkan .sebelum module_1di module_2.pyadalah bahwa jika kita tidak melakukan itu dan lari main.py, python interpreter akan mengatakan No module named 'module_1', itu sedikit rumit, module_1.pytepat di samping module_2.py. Sekarang aku membiarkan func_1()dalam module_1.pydo sesuatu:

def func_1():
    print(__name__)

yang __name__merekam siapa yang memanggil func_1. Sekarang kita simpan .sebelumnya module_1, jalankan main.py, itu akan mencetak package_1.module_1, bukan module_1. Ini menunjukkan bahwa orang yang memanggil func_1()berada pada hierarki yang sama dengan main.py, yang .menyiratkan yang module_1berada pada hierarki yang sama dengan module_2.pydirinya. Jadi, jika tidak ada titik, main.pyakan mengenali module_1hierarki yang sama dengan dirinya, ia dapat mengenalipackage_1 , tetapi bukan apa yang "di bawah" itu.

Sekarang mari kita membuatnya agak rumit. Anda memiliki config.inidan modul mendefinisikan fungsi untuk membacanya di hierarki yang sama dengan 'main.py'.

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
    main.py

Dan untuk beberapa alasan yang tidak dapat dihindari, Anda harus memanggilnya module_2.py, sehingga harus mengimpor dari hierarki atas. module_2.py :

 import ..config
 pass

Dua titik berarti impor dari hierarki atas (tiga titik akses atas dari atas, dan seterusnya). Sekarang kita jalankan main.py, penafsir akan berkata: ValueError:attempted relative import beyond top-level package. "Paket tingkat atas" di sini adalah main.py. Hanya karena config.pyada di samping main.py, mereka berada di hierarki yang sama, config.pytidak "di bawah" main.py, atau tidak "dipimpin" oleh main.py, jadi itu di luar main.py. Untuk memperbaikinya, cara paling sederhana adalah:

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
main.py

Saya pikir itu bertepatan dengan prinsip mengatur hierarki file proyek, Anda harus mengatur modul dengan fungsi yang berbeda di folder yang berbeda, dan hanya meninggalkan pemanggil teratas di luar, dan Anda dapat mengimpor sesuka Anda.

Findon Fassbender
sumber
-5

Ini juga berfungsi, dan jauh lebih sederhana daripada apa pun dengan sysmodul:

with open("C:/yourpath/foobar.py") as f:
    eval(f.read())
jgilley
sumber
1
Jika OP akan meng-hardcode sebuah path, mereka bisa memasukkan path itu ke PYTHONPATH. Saya pikir intinya adalah melakukannya dengan cara yang tidak membuat hardcode jalan karena akan merusak tempat lain.
Matius
-15

Panggil saya terlalu berhati-hati, tapi saya suka membuat saya lebih portabel karena tidak aman untuk menganggap bahwa file akan selalu berada di tempat yang sama di setiap komputer. Secara pribadi saya memiliki kode mencari jalur file terlebih dahulu. Saya menggunakan Linux sehingga milik saya akan terlihat seperti ini:

import os, sys
from subprocess import Popen, PIPE
try:
    path = Popen("find / -name 'file' -type f", shell=True, stdout=PIPE).stdout.read().splitlines()[0]
    if not sys.path.__contains__(path):
        sys.path.append(path)
except IndexError:
    raise RuntimeError("You must have FILE to run this program!")

Itu tentu saja kecuali jika Anda berencana untuk mengemasnya bersama-sama. Tetapi jika itu masalahnya Anda tidak benar-benar membutuhkan dua file terpisah.

SuperFamousGuy
sumber
11
Sangat tidak efisien!
0xc0de
1
File akan selalu berada di tempat yang sama di setiap komputer, diberi jalur relatif.
Sagar Hatekar