koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da dosyalar içe nasıl aktarılır?

Python’da diğer dosyaları içe nasıl aktarabiliriz?

  1. file.py gibi belirli bir python dosyasının tamamını nasıl içe aktarabiliriz?
  2. Belirli bir dosya yerine klasörü nasıl alabiliriz?
  3. Python dosyasını kullanıcı girişine göre çalışma zamanında dinamik olarak nasıl yükleriz?
  4. Dosyadan sadece belirli bir bölümü nasıl yükleriz?

Örneğin main.py dosyamız olsun:

from extra import * 

Bu şekilde extra içerisindeki tüm tanımları alıyoruz ama, belki de sadece aşağıdaki bir fonksiyonu istiyoruz

def gap():
    print
    print

Sadece gap fonksiyonunu almak için ne yapacağız?


Python dosyalarını içe aktarmanın birçok yolu var. Bunlara artıları ve eksileri ile birlikte bakalım.

Öncelikle çalışan ilk içe aktarma stratejisini aceleyle seçmeyin. Aksi takdirde kod tabanını daha sonra gereksinimlerinizi karşılamadığını bulduğunuzda yeniden yazmanız gerekir.

En kolay örneği 1 numaraya koyalım, en profesyonel ve sağlam örneğe doğru ilerleyelim (7 numara)

Örnek 1, Python yorumlayıcılı bir python modülini içe aktarın:

Aşağıdaki kodu /home/el/foo/fox.py içine koyun:

def what_does_the_fox_say():
  print("vixens cry")

Python yorumlayıcısına girin:

el@apollo:/home/el/foo$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
>>> import fox
>>> fox.what_does_the_fox_say()
vixens cry
>>> 

fox.py dosyasını python yorumlayıcısı aracılığıyla içe aktardınız ve what_does_the_fox_say() piton işlevini fox.py içinden çağırmışsınız. 

Örnek 2, Python dosyasını yerinde yürütmek için komut dosyasında execfile veya (Python 3’te exec) kullanın:

Aşağıdaki kodu /home/el/foo2/mylib.py içine koyun:

def moobar():
  print("hi")

Bu kodu da /home/el/foo2/main.py içine koyun:

execfile("/home/el/foo2/mylib.py")
moobar()

dosyayı çalıştırın:

el@apollo:/home/el/foo$ python main.py
hi

Moobar fonksiyonu mylib.py’dan içe aktarıldı ve main.py içinde çalışır hale geldi

Örnek 3, from … import … yöntemi:

Bunu /home/el/foo3/chekov.py içine koyun:

def question():
  print "where are the nuclear wessels?"

Bunu /home/el/foo3/main.py içine koyun:

from chekov import question
question()

Çalıştırın:

el@apollo:/home/el/foo3$ python main.py 
where are the nuclear wessels?

chekov.py’de başka işlevler tanımladıysanız, import * yazmadığınız sürece diğerlerine ulaşamayacaksınız.

Örnek 4, içe aktarıldığı yerden farklı bir dosya konumundaki dosyayı aktarma

Bunu /home/el/foo4/stuff/riaa.py içine koyun:

def watchout():
  print "computers are transforming into a noose and a yoke for humans"

Bunu /home/el/foo4/main.py içine koyun:

import sys 
import os
sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
from riaa import *
watchout()

Çıktı:

el@apollo:/home/el/foo4$ python main.py 
computers are transforming into a noose and a yoke for humans

Bu, diğer dosyadaki her şeyi farklı bir dizinden aldı.

Örnek 5, os.system("python yourfile.py")

import os
os.system("python yourfile.py")

Örnek 6, python startuphook’una yaslanarak dosyanızı içe aktarın:

Bu örnek önceden hem python2 hem de 3 için çalışırdı, ancak şimdi yalnızca python2 için çalışıyor. python3, düşük beceriye sahip python kitaplığı yazarları tarafından kötüye kullanıldığı için startuphook özelliği kaldırıldı. Bunun python3 için çalışmasını istiyorsanız, daha yaratıcı olmalısınız. Nasıl yapılacağını söylersem, python geliştiricileri bu özellik kümesini de devre dışı bırakır, dolayısıyla kendi başınasınız.

Bakınız: https://docs.python.org/2/library/user.html

Bu kodu giriş dizininize ~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

Bu kodu ise main.py (her yerde olabilir) ekleyin:

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

Çalıştırınca aşağıdaki çıktıyı almalısınız:

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

Burada bir ModuleNotFoundError: No module named 'user' hatası alırsanız python3 kullandığınız anlamına gelir. Startuphooks varsayılan olarak orada devre dışıdır

Örnek 7, En iyi yöntem: Python’daki dosyaları import komutuyla içe aktarma:

Yeni bir dizin oluşturun: /home/el/foo5/

Bir dizin daha oluşturun: /home/el/foo5/herp

herp klasörü altında __init__.py olarak adlandırılmış boş bir dosya oluşturun

el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.py

Yeni bir dizin oluşturun: /home/el/foo5/herp/derp

Derp altında başka bir dosya yapın:__init__.py

el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.py

/home/el/foo5/herp/derp altında yolo.py adlı yeni bir dosya oluşturun ve aşağıdaki kodu bu dosyaya kaydedin:

def skycake():
  print "SkyCake evolves to stay just beyond the cognitive reach of " +
  "the bulk of men. SKYCAKE!!"

İşte gerçek anı. /home/el/foo5/main.py isimli yeni bir dosya oluşturun ve aşağıdaki kodu buraya koyun:

from herp.derp.yolo import skycake
skycake()

Çalıştırın:

el@apollo:/home/el/foo5$ python main.py
SkyCake evolves to stay just beyond the cognitive reach of the bulk 
of men. SKYCAKE!!

Boş __init__.py dosyası, geliştiricinin, bu dizinin içe aktarılabilir bir paket olmasını amaçladığını python yorumlayıcısına iletir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top