Mengimpor modul dari folder induk

626

Saya menjalankan Python 2.5.

Ini pohon folder saya:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Saya juga punya __init__.pydi setiap folder, dihilangkan di sini agar mudah dibaca)

Bagaimana cara mengimpor nibmodul dari dalam lifemodul? Saya berharap ini bisa dilakukan tanpa bermain-main dengan sys.path.

Catatan: Modul utama yang dijalankan ada di ptdraftfolder.

Ram Rachum
sumber
1
Apa pengaturan PYTHONPATH Anda?
S.Lott
2
Ross: Saya melihat ke sana. Apa yang harus saya lakukan? Saya sudah punya __init__.py. S.Lott: Saya tidak tahu cara memeriksa ...
Ram Rachum
4
gema $ PYTHONPATH dari shell; sistem impor; cetak sys.path dari dalam Python. docs.python.org/tutorial/…
S.Lott
@FlipMcF Google adalah mesin pencari yang menggelembung, jadi fakta bahwa hasil ini cukup tinggi bagi Anda, tidak masalah. Jauh lebih penting adalah kenyataan bahwa mesin pencari non-bubbled, DuckDuckGo, juga menempati peringkat yang sangat tinggi.
ArtOfWarfare
3
Saya sangat menyarankan melewati semua sys.pathatau PYTHONPATHjawaban dan memeriksa jawaban np8 yang sangat baik . Ya, sudah lama dibaca. Ya, sepertinya banyak pekerjaan. Tapi itu satu-satunya jawaban yang benar-benar menyelesaikan masalah dengan benar dan bersih.
Aran-Fey

Jawaban:

119

Tampaknya masalahnya tidak terkait dengan modul yang berada di direktori induk atau semacamnya.

Anda perlu menambahkan direktori yang berisi ptdraftke PYTHONPATH

Anda mengatakan bahwa import nibbekerja dengan Anda, itu mungkin berarti Anda menambahkan ptdraftdirinya sendiri (bukan orang tuanya) ke PYTHONPATH.

Hasen
sumber
15
Harus menambahkan semuanya ke pythonpath bukanlah solusi yang baik jika Anda bekerja dengan banyak paket yang tidak akan pernah digunakan kembali.
Jason Cheng
@JasonCheng: Lalu mengapa mereka paket ?
Davis Herring
7
Bagi saya jawaban ini berhasil. Namun, untuk membuatnya lebih eksplisit, prosedurnya adalah import sysdan kemudiansys.path.append("..\<parent_folder>")
BCJuan
604

Anda dapat menggunakan impor relatif (python> = 2.5):

from ... import nib

(Apa yang Baru di Python 2.5) PEP 328: Impor Mutlak dan Relatif

EDIT : menambahkan titik lain '.' untuk naik dua paket

f3lix
sumber
178
ValueError: Attempted relative import in non-package
endolith
18
@endolith: Anda harus berada dalam satu paket, yaitu, Anda harus memiliki file .py init .
kirbyfan64sos
31
Upaya impor relatif di luar paket tingkat teratas
Pengguna
291
Untuk lebih tepatnya, Anda memerlukan __init__.pyfile.
kara deniz
17
Lihat juga jawaban berikut, karena menambahkan __init__.pybukan satu-satunya hal yang harus Anda lakukan: stackoverflow.com/questions/11536764/…
Ben Farmer
286

Impor relatif (seperti dalam from .. import mymodule) hanya bekerja dalam satu paket. Untuk mengimpor 'mymodule' yang ada di direktori induk modul Anda saat ini:

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 

import mymodule

sunting : __file__atribut tidak selalu diberikan. Alih-alih menggunakan os.path.abspath(__file__)saya sekarang menyarankan menggunakan modul memeriksa untuk mengambil nama file (dan path) dari file saat ini

Remi
sumber
97
sesuatu yang sedikit lebih pendek:sys.path.insert(1, os.path.join(sys.path[0], '..'))
JHolta
8
Ada alasan untuk menghindari sys.path.append () alih-alih memasukkan?
Tyler
2
@ Tyler - Bisa jadi masalah jika di tempat lain maka parentdir, tetapi di salah satu jalur yang sudah ditentukan sys.path, ada modul lain dengan nama 'mymodule'. Menyisipkan parentdirsebagai elemen pertama dari sys.pathdaftar memastikan bahwa modul dari parentdirakan diimpor sebagai gantinya.
Remi
5
@JHolta Jika Anda tidak berurusan dengan paket, milik Anda adalah solusi terbaik.
Jonathon Reinhart
5
@JHolta ide bagus. sys.path.insert(1, os.path.realpath(os.path.pardir))bekerja juga.
SpeedCoder5
178

Saya memposting jawaban yang sama juga untuk pertanyaan tentang impor dari paket saudara. Anda bisa melihatnya di sini .

Solusi tanpa sys.pathperetasan

Ringkasan

  • Bungkus kode ke dalam satu folder (misalnya packaged_stuff)
  • Gunakan buat setup.pyskrip tempat Anda menggunakan setuptools.setup () .
  • Pip instal paket dengan status yang dapat diedit pip install -e <myproject_folder>
  • Impor menggunakan from packaged_stuff.modulename import function_name

Mendirikan

Saya menganggap struktur folder yang sama seperti pada pertanyaan

.
└── ptdraft
    ├── __init__.py
    ├── nib.py
    └── simulations
        ├── __init__.py
        └── life
            ├── __init__.py
            └── life.py

Saya memanggil .folder root, dan dalam kasus saya ini terletak di C:\tmp\test_imports.

Langkah

1) Tambahkan setup.pyke folder root

Isi dari setup.pybisa sederhana

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())

Pada dasarnya "apapun" setup.pyakan berhasil. Ini hanya contoh kerja minimal.

2) Gunakan lingkungan virtual

Jika Anda terbiasa dengan lingkungan virtual, aktifkan satu, dan lewati ke langkah berikutnya. Penggunaan lingkungan virtual tidak mutlak diperlukan, tetapi mereka benar - benar akan membantu Anda dalam jangka panjang (ketika Anda memiliki lebih dari 1 proyek yang sedang berlangsung ..). Langkah paling dasar adalah (dijalankan di folder root)

  • Buat virtual env
    • python -m venv venv
  • Aktifkan virtual env
    • . /venv/bin/activate(Linux) atau ./venv/Scripts/activate(Menang)

Untuk mempelajari lebih lanjut tentang ini, cukup Google "tutorial python virtualenv" atau serupa. Anda mungkin tidak pernah membutuhkan perintah selain membuat, mengaktifkan, dan menonaktifkan.

Setelah Anda membuat dan mengaktifkan lingkungan virtual, konsol Anda harus memberi nama lingkungan virtual dalam tanda kurung

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>

3) pip instal proyek Anda dalam keadaan dapat diedit

Instal paket tingkat atas Anda myprojectmenggunakan pip. Caranya adalah dengan menggunakan -ebendera saat melakukan instalasi. Dengan cara ini diinstal dalam keadaan dapat diedit, dan semua pengeditan yang dilakukan pada file .py akan secara otomatis disertakan dalam paket yang diinstal.

Di direktori root, jalankan

pip install -e . (perhatikan titik, singkatan dari "direktori saat ini")

Anda juga dapat melihat bahwa itu diinstal dengan menggunakan pip freeze

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0

4) Impor dengan menambahkan mainfolderke setiap impor

Dalam contoh ini, mainfolderakan menjadi ptdraft. Ini memiliki keuntungan bahwa Anda tidak akan mengalami tabrakan nama dengan nama modul lain (dari pustaka standar python atau modul pihak ke-3).


Contoh Penggunaan

nib.py

def function_from_nib():
    print('I am the return value from function_from_nib!')

life.py

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()

Menjalankan life.py

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
np8
sumber
1
Mengapa ini bekerja? Apakah itu mengubah PYTHONPATH di balik layar entah bagaimana?
Homero Esmeraldo
2
Juga, mengapa ini lebih baik atau lebih elegan daripada menggunakan pendekatan sys.path?
Homero Esmeraldo
5
@HomeroBarrocasSEsmeraldo Pertanyaan bagus. PYTHONPATH env var tidak tersentuh. Ini menginstal ke dalam paket situs , yang sudah ada sys.pathdan di mana kode biasanya akan diinstal oleh pengguna akhir. Itu lebih baik daripada sys.pathperetasan (dan Anda dapat menyertakan menggunakan PYTHONPATH dalam kategori peretasan jalur itu) karena itu berarti kode dalam pengembangan harus berperilaku dengan cara yang sama bagi Anda seperti halnya bagi pengguna lain. Sebaliknya, ketika menggunakan modifikasi jalur, pernyataan impor akan diselesaikan dengan cara yang berbeda.
wim
5
Sejauh ini, ini solusi terbaik yang pernah saya baca. Ini menciptakan tautan ke direktori Anda saat ini sehingga semua pembaruan kode langsung tercermin ke direktori kerja Anda. Jika Anda perlu menghapus entri ini, Hapus file telur secara manual dan hapus entri dari instal mudah dalam paket-paket (paket situs jika Anda menggunakan pip).
Rakshit Kothari
2
mengapa membuat sakit kepala impor python lebih rumit? Kita harus menulis file setup, env virtual, instalasi pip? Oh Tuhan!
Emerson Xu
68

Anda dapat menggunakan jalur tergantung OS di "jalur pencarian modul" yang tercantum di sys.path . Jadi Anda dapat dengan mudah menambahkan direktori induk seperti berikut

import sys
sys.path.insert(0,'..')

Jika Anda ingin menambahkan direktori parent-parent,

sys.path.insert(0,'../..')

Ini berfungsi baik di python 2 dan 3.

Shinbero
sumber
6
Ini relatif terhadap direktori saat ini , bahkan belum tentu yang berisi skrip utama.
Davis Herring
57

Jika menambahkan folder modul Anda ke PYTHONPATH tidak berfungsi, Anda dapat memodifikasi daftar sys.path di program Anda di mana penerjemah Python mencari modul untuk diimpor, dokumentasi python mengatakan:

Ketika modul bernama spam diimpor, penerjemah pertama-tama mencari modul bawaan dengan nama itu. Jika tidak ditemukan, ia kemudian mencari file bernama spam.py di daftar direktori yang diberikan oleh variabel sys.path. sys.path diinisialisasi dari lokasi ini:

  • direktori yang berisi skrip input (atau direktori saat ini).
  • PYTHONPATH (daftar nama direktori, dengan sintaksis yang sama dengan PATH variabel shell).
  • standar yang bergantung pada instalasi.

Setelah inisialisasi, program Python dapat memodifikasi sys.path . Direktori yang berisi skrip yang dijalankan ditempatkan di awal jalur pencarian, di depan jalur perpustakaan standar. Ini berarti bahwa skrip dalam direktori tersebut akan dimuat alih-alih modul dengan nama yang sama di direktori perpustakaan. Ini adalah kesalahan kecuali penggantian dimaksudkan.

Mengetahui hal ini, Anda dapat melakukan hal berikut dalam program Anda:

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
Ricardo Murillo
sumber
6
Jawaban Anda bagus, tetapi mungkin tidak selalu berhasil dan tidak terlalu portabel. Jika program dipindahkan ke lokasi baru, /path/to/ptdraftharus diedit. Ada solusi yang bekerja di luar direktori file saat ini dan mengimpornya dari folder induk juga.
Edward
@Edward apa teknik itu?
Shuklaswag
1
@Shuklaswag misalnya, jawabannya stackoverflow.com/questions/714063/… .
Edward
50

Tidak tahu banyak tentang python 2.
Dalam python 3, folder induk dapat ditambahkan sebagai berikut:

import sys 
sys.path.append('..')

... dan kemudian seseorang dapat mengimpor modul dari itu

Rob Ellenbroek
sumber
13
Ini hanya berfungsi jika direktori kerja Anda saat ini sedemikian rupa sehingga '..'mengarah ke direktori dengan modul yang dimaksud.
user5359531
31

Berikut adalah jawaban yang sederhana sehingga Anda dapat melihat cara kerjanya, kecil dan lintas platform.
Ini hanya menggunakan modul built-in ( os, sysdan inspect) jadi harus bekerja
pada sistem operasi (OS) apa pun karena Python dirancang untuk itu.

Kode pendek untuk jawaban - lebih sedikit baris dan variabel

from inspect import getsourcefile
import os.path as path, sys
current_dir = path.dirname(path.abspath(getsourcefile(lambda:0)))
sys.path.insert(0, current_dir[:current_dir.rfind(path.sep)])
import my_module  # Replace "my_module" here with the module name.
sys.path.pop(0)

Untuk baris yang lebih sedikit dari ini, ganti baris kedua dengan import os.path as path, sys, inspect,
tambahkan inspect.di awal getsourcefile(baris 3) dan hapus baris pertama.
- namun ini mengimpor semua modul sehingga dapat membutuhkan lebih banyak waktu, memori, dan sumber daya.

Kode untuk jawaban saya ( versi lebih panjang )

from inspect import getsourcefile
import os.path
import sys

current_path = os.path.abspath(getsourcefile(lambda:0))
current_dir = os.path.dirname(current_path)
parent_dir = current_dir[:current_dir.rfind(os.path.sep)]

sys.path.insert(0, parent_dir)

import my_module  # Replace "my_module" here with the module name.

Ini menggunakan contoh dari jawaban Stack Overflow Bagaimana cara mendapatkan path dari
file yang dieksekusi saat ini di Python?
untuk menemukan sumber (nama file) kode yang sedang berjalan dengan alat bawaan.

from inspect import getsourcefile  
from os.path import abspath  

Selanjutnya, di mana pun Anda ingin mencari file sumber dari Anda cukup gunakan:

abspath(getsourcefile(lambda:0))

Kode saya menambahkan path file ke sys.path, daftar path python
karena ini memungkinkan Python untuk mengimpor modul dari folder itu.

Setelah mengimpor modul dalam kode, sebaiknya jalankan sys.path.pop(0)di baris baru
ketika folder yang ditambahkan memiliki modul dengan nama yang sama dengan modul lain yang diimpor
kemudian di program. Anda perlu menghapus item daftar yang ditambahkan sebelum impor, bukan jalur lain.
Jika program Anda tidak mengimpor modul lain, aman untuk tidak menghapus path file karena
setelah program berakhir (atau me-restart shell Python), setiap pengeditan dibuat sys.pathmenghilang.

Catatan tentang variabel nama file

Jawaban saya tidak menggunakan __file__variabel untuk mendapatkan path file / nama file dari
kode yang sedang berjalan karena pengguna di sini sering menggambarkannya sebagai tidak dapat diandalkan . Anda tidak boleh menggunakannya
untuk mengimpor modul dari folder induk dalam program yang digunakan oleh orang lain.

Beberapa contoh di mana tidak bekerja (kutipan dari ini pertanyaan Stack Overflow):

tidak dapat ditemukan pada beberapa platform • kadang-kadang bukan path file lengkap

  • py2exetidak memiliki __file__atribut, tetapi ada solusinya
  • Ketika Anda menjalankan dari IDLE dengan execute()tidak ada __file__atribut
  • OS X 10.6 di mana saya dapatkan NameError: global name '__file__' is not defined
Edward
sumber
1
Saya melakukan ini dan menghapus entri jalur baru dengan sys.path.pop(0)segera setelah mengimpor modul yang diinginkan. Namun, impor berikutnya masih pergi ke lokasi itu. Sebagai contoh, saya punya app/config, app/toolsdan app/submodule/config. Dari submodule, saya menyisipkan app/untuk impor tools, kemudian menghapus app/dan mencoba untuk impor config, tapi aku mendapatkan app/configbukannya app/submodule/config.
user5359531
Saya tahu bahwa salah satu toolsimpor juga mengimpor configdari direktori induk. Jadi ketika saya kemudian mencoba melakukannya sys.path.pop(0); import configdi dalam submodule, berharap untuk mendapatkan app/submodule/config, saya benar-benar mendapatkan app/config. Jelas Python mengembalikan versi cache modul dengan nama yang sama dan bukan benar-benar memeriksa sys.pathmodul yang cocok dengan nama itu. sys.pathdalam hal ini sedang diubah dengan benar, Python tidak mengeceknya karena modul dengan nama yang sama telah dimuat.
user5359531
Saya pikir ini adalah referensi yang tepat untuk masalah yang saya miliki: docs.python.org/3/reference/import.html#the-module-cache
user5359531
Beberapa informasi bermanfaat dari 5.3.1. Cache modul pada halaman dokumentasi : Selama impor, nama modul dicari di sys.modules ... sys.modules dapat ditulis. Menghapus kunci akan membatalkan entri cache untuk modul bernama, menyebabkan Python mencari lagi setelah impor berikutnya. ... Berhati-hatilah, seolah-olah Anda menyimpan referensi ke objek modul, membatalkan cache-nya lalu mengimpor kembali, kedua objek akan berbeda. Sebaliknya, importlib.reload()akan menggunakan kembali dan menginisialisasi ulang isi modul ...
Edward
Bahkan lebih pendek: os.path.realpath(getsourcefile(lambda:0) + "/../.."). Akan mendapatkan file sumber saat ini ditambahkan dengan dua simbol direktori induk. Saya tidak menggunakan os.path.sepseperti getsourcefilemengembalikan string menggunakan /bahkan pada Windows. realpathakan menangani pemunculan dua entri direktori dari path lengkap (dalam hal ini, nama file, dan kemudian direktori saat ini) yang memberikan direktori induk.
Coburn
28

Berikut ini adalah solusi yang lebih umum yang menyertakan direktori induk ke sys.path (berfungsi untuk saya):

import os.path, sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
Mike
sumber
import os, sys\n sys.path.insert(0,os.path.pardir) hal yang sama, tetapi penyortir :) (tidak ada baris feed dalam komentar)
Anti Veeranna
@ antiveeranna, jika Anda menggunakan, os.path.pardirAnda tidak akan mendapatkan jalur utama dari induknya, cukup jalur relatif dari tempat Anda memanggilsys.path.insert()
alvas
1
Jawaban ini menggunakan __file__variabel yang bisa tidak dapat diandalkan (tidak selalu path file lengkap, tidak bekerja pada setiap sistem operasi, dll.) Seperti yang sering disebutkan pengguna StackOverflow. Mengubah jawaban untuk tidak memasukkannya akan menyebabkan lebih sedikit masalah dan lebih kompatibel lintas. Untuk informasi lebih lanjut, lihat stackoverflow.com/a/33532002/3787376 .
Edward
23

Saya menemukan cara berikut berfungsi untuk mengimpor paket dari direktori induk skrip. Dalam contoh ini, saya ingin mengimpor fungsi env.pydari app.dbpaket.

.
└── my_application
    └── alembic
        └── env.py
    └── app
        ├── __init__.py
        └── db
import os
import sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)
Yu N.
sumber
Jadi, satu sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
kalimat yang
Memodifikasi sys.pathsama sekali biasanya merupakan ide yang buruk. Anda memerlukan beberapa cara ( mis. , PYTHONPATH) Agar perpustakaan Anda dapat diakses oleh kode lain (atau kalau bukan itu sebenarnya perpustakaan); gunakan saja sepanjang waktu!
Davis Herring
14

Solusi yang disebutkan di atas juga baik-baik saja. Solusi lain untuk masalah ini adalah

Jika Anda ingin mengimpor sesuatu dari direktori tingkat atas. Kemudian,

from ...module_name import *

Juga, jika Anda ingin mengimpor modul apa pun dari direktori induk. Kemudian,

from ..module_name import *

Juga, jika Anda ingin mengimpor modul apa pun dari direktori induk. Kemudian,

from ...module_name.another_module import *

Dengan cara ini Anda dapat mengimpor metode tertentu jika Anda mau.

Ravin Gupta
sumber
6
Sepertinya ini memang seharusnya, tetapi untuk beberapa alasan ini tidak bekerja dengan cara yang sama seperti sys.path.appendperetasan di atas dan saya tidak dapat mengimpor lib saya seperti ini. Inilah yang pertama kali saya coba lakukan sebelum mulai ke google :) Ok, beginiValueError: attempted relative import beyond top-level package
juzzlin
10

Bagi saya oneliner terpendek dan favorit saya untuk mengakses ke direktori induk adalah:

sys.path.append(os.path.dirname(os.getcwd()))

atau:

sys.path.insert(1, os.path.dirname(os.getcwd()))

os.getcwd () mengembalikan nama direktori kerja saat ini, os.path.dirname (direktori_name) mengembalikan nama direktori untuk yang dilewati.

Sebenarnya, menurut saya arsitektur proyek Python harus dilakukan dengan cara di mana tidak ada modul dari direktori anak akan menggunakan modul apa pun dari direktori induk. Jika sesuatu seperti ini terjadi, perlu memikirkan kembali tentang pohon proyek.

Cara lain adalah menambahkan direktori induk ke variabel lingkungan sistem PYTHONPATH.

zviad
sumber
2
+1 untuk menyebutkan kemungkinan harus merestrukturisasi proyek (sebagai lawan untuk meretas masalah)
semore_1267
ini tidak mendapatkan orang tua, itu mendapatkan arus
Ricky Levi
9

Dalam Notebook Jupyter

Selama Anda bekerja di Notebook Jupyter, solusi singkat ini mungkin berguna:

%cd ..
import nib

Ia bekerja bahkan tanpa __init__.pyfile.

Saya mengujinya dengan Anaconda3 di Linux dan Windows 7.

Thomas R
sumber
2
Tidakkah masuk akal untuk menambahkan %cd -setelah impor, sehingga direktori notebook saat ini tetap tidak berubah.
Dror
8

import sys sys.path.append('../')

Andong Zhan
sumber
8
ini tidak akan berfungsi ketika dijalankan dari direktori yang berbeda.
Shatlyk Ashyralyyev
5

Ketika tidak berada dalam lingkungan paket dengan __init__.pyfile pustaka pathlib (termasuk dengan> = Python 3.4) membuatnya sangat ringkas dan intuitif untuk menambahkan path direktori induk ke PYTHONPATH:

import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))
itmatters
sumber
apakah mungkin menggunakan init .py untuk menghindari masalah ini?
Kecerdasan Buatan Artifisial
4

jenis gaya yang sama dengan jawaban masa lalu - tetapi dalam beberapa baris: P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

file mengembalikan lokasi tempat Anda bekerja

YFP
sumber
Bagi saya file adalah nama file tanpa path yang disertakan. Saya menjalankannya menggunakan "ipy filename.py".
Curtis Yallop
Hai @CurtisYallop dalam contoh di atas kami menambahkan dir yang berisi file [bahwa kita saat ini berada] bahwa file python ada di. Panggilan os.path.dirname dengan nama file harus mengembalikan path file dan kami menambahkan ITU ke path dan bukan file secara eksplisit - HTH :-)
YFP
Anda mengasumsikan __file__ selalu berisi path plus file. Terkadang hanya berisi nama file tanpa path.
Curtis Yallop
@CurtisYallop - sama sekali tidak Pak, saya berasumsi file adalah nama file dan saya menggunakan os.path.dirname () untuk mendapatkan path untuk file tersebut. Apakah Anda punya contoh ini tidak berfungsi? Saya ingin langkah-langkah untuk mereproduksi
YFP
1
@CurtisYallop - Tidak, saya tidak! Saya mengatakan bahwa: print / _ / file / _ / akan memberi Anda nama file dalam contoh Anda di atas "file.py" - Saya kemudian mengatakan bahwa Anda dapat menggunakan os.path.dirname () untuk menarik path lengkap dari itu . Jika Anda menelepon dari beberapa lokasi yang aneh dan Anda ingin hubungan itu maka Anda dapat dengan mudah menemukan dir Anda bekerja melalui modul os - Astaga!
YFP
1

Bekerja dengan perpustakaan. Buat pustaka yang disebut nib, instal menggunakan setup.py, biarkan berada di paket-situs dan masalah Anda terpecahkan. Anda tidak harus memasukkan semua yang Anda buat dalam satu paket. Pecah-pecah.

pengguna3181121
sumber
1
Ide Anda bagus tetapi beberapa orang mungkin ingin menggabungkan modul mereka dengan kode mereka - mungkin untuk membuatnya portabel dan tidak perlu menempatkan modul mereka di site-packagessetiap kali mereka menjalankannya di komputer yang berbeda.
Edward
0

Dalam sistem Linux, Anda dapat membuat tautan lunak dari folder "life" ke file nib.py. Kemudian, Anda dapat mengimpornya seperti:

import nib
Erel Segal-Halevi
sumber