Python'daki başka bir dosyadan işlev çağırma


496

Set_up: Bir programda kullanmam gereken her işlev için bir .py dosyam var.

Bu programda, işlevi harici dosyalardan çağırmam gerekiyor.

Denedim:

from file.py import function(a,b)

Ama hatayı alıyorum:

ImportError: 'file.py' adlı modül yok; dosya bir paket değil

Bu sorunu nasıl düzeltirim?


65
from file import function. Dosya uzantılarına veya işlev parametrelerine gerek yok
samrap

4
Muhtemelen Python eğitimindeki modüller bölümünü gözden geçirmelisiniz.
Burhan Khalid

PyCharms kullanıyorsanız, yalnızca alt çizgi ile ayrılmış bir dosya adını tanıyacağından emin olun.
Jerry

Ayrıca, işlevi işlevinden içe aktarmak istiyorsanız file.py, dizinde adında bir paket olmadığından emin olun file.
04:04

Yanıtlar:


553

file.pyİçe aktarma sırasında ekleme yapmaya gerek yoktur . Sadece yazın from file import functionve kullanarak fonksiyonu çağırın function(a, b). Bunun işe fileyaramamasının nedeni Python'un çekirdek modüllerinden biridir, bu nedenle dosyanızın adını değiştirmenizi öneririm.

Eğer ithalat işlevlerine çalışıyorsanız, Not a.pyadlı bir dosyaya b.py, emin olun gerekir a.pyve b.pyaynı dizinde bulunmaktadır.


3
"Dosya" sadece asıl dosya adı değil, sorduğum soru için bir yer tutucuydu. Yine de teşekkürler. Bunu deneyeceğim ve size geri döneceğim.
user2977230

4
Bunu denedim, ama hala hatayı gösteriyor: Python 3 ile ilgisi var mı, yoksa genel bir sorun mu var?
DarkRose

4
@GamesBrainiac, işlevleri içe aktarmak istediğiniz dosya farklı bir dizindeyse ne olur? Dosya adından önceki dosya yolunu ekleyebilir miyim, yoksa daha karmaşık bir şey var mı?
Tom

6
@Tom Zaten orada değilse, bu yolu PYTHONPATH değişkenine eklemeniz gerekir.
Oyunlar Brainiac

13
Aynı dizinde bulunmuyorlarsa işlevleri a.py dosyasından b.py dosyasına aktarmanın bir yolu var mı?
Nirvan Sengupta

192

Her şeyden önce bir ihtiyacınız yok .py.

Dosyanız varsa a.pyve içinde bazı işlevleriniz vardır:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

Ve onları içe aktarmak z.pyistiyorsan yazmak zorundasın

from a import b, c

47
Ayrıca *
Dimitar Marinov

1
@DimitarMarinov * ile dosya adı mı değiştirildi?
Karlo

3
@Karlo, hayır, sadece *
Dimitar Marinov

26
"import *" kullanmak kötü bir uygulama olarak kabul edilir. Açık, örtük olmaktan iyidir.
Francisco Gutiérrez

A.py bir klasörde fol1 diyorsa, nasıl içe aktarılır? @ dimitar-marinov
Aditya C

57

Bunu 2 şekilde yapabilirsiniz. Birincisi, sadece file.py'den istediğiniz işlevi almaktır. Bunu yapmak için

from file import function

Başka bir yol da dosyanın tamamını içe aktarmaktır

import file as fl

Ardından file.py içindeki herhangi bir işlevi kullanarak

fl.function(a,b)

36

İşlevin çalıştığınız aynı dizinde olmasını istemiyorsanız veya istemiyorsanız, işlevi farklı bir dizinden de çağırabilirsiniz. Bunu iki şekilde yapabilirsiniz (belki daha fazla alternatif var, ama bunlar benim için çalışanlar).

Alternatif 1 Çalışma dizininizi geçici olarak değiştirin

import os

os.chdir("**Put here the directory where you have the file with your function**")

from file import function

os.chdir("**Put here the directory where you were working**")

Alternatif 2 İşlevinizin bulunduğu dizini sys.path dosyasına ekleyin

import sys

sys.path.append("**Put here the directory where you have the file with your function**")

from file import function

1
PYTHONPATH'a yol eklemekle aynı şey değil mi?
19'da Birish

33

Dosyanız farklı paket yapısındaysa ve farklı bir paketten çağırmak istiyorsanız, o şekilde arayabilirsiniz:

Diyelim ki python projenizde aşağıdaki paket yapınız var:

Python paketi ve dosya yapısı

in - com.my.func.DifferentFunctionpython dosyası gibi bazı fonksiyonlarınız var:

def add(arg1, arg2):
    return arg1 + arg2

def sub(arg1, arg2) :
    return arg1 - arg2

def mul(arg1, arg2) :
    return arg1 * arg2

Ve sizden farklı işlevleri çağırmak istiyorsunuz Example3.py, daha sonra bunu yapabilirsiniz:

İçe aktarma ifadesini tanımla Example3.py- tüm fonksiyonu içe aktarmak için dosya

from com.my.func.DifferentFunction import *

veya içe aktarmak istediğiniz her işlev adını tanımlayın

from com.my.func.DifferentFunction import add, sub, mul

Sonra Example3.pyexecute işlevini çağırabilirsiniz:

num1 = 20
num2 = 10

print("\n add : ", add(num1,num2))
print("\n sub : ", sub(num1,num2))
print("\n mul : ", mul(num1,num2))

Çıktı:

 add :  30

 sub :  10

 mul :  200

3
glob ithalatı önerilmez.
jdhao

21

Aynı özelliğe rastladım ama çalışmasını sağlamak için aşağıdakileri yapmak zorunda kaldım.

'ModuleNotFoundError: Adında modül yok' ifadesini görüyorsanız, büyük olasılıkla dosya adının önünde aşağıdaki gibi nokta (.) Gerekir;

dan .file ithalat funtion


13

İlk olarak dosyayı .py formatında kaydedin (örneğin my_example.py). Ve bu dosyanın işlevleri varsa,

def xyz():

        --------

        --------

def abc():

        --------

        --------

Arama işlevinde aşağıdaki satırları yazmanız yeterlidir.

dosya_adı: my_example2.py

============================

import my_example.py


a = my_example.xyz()

b = my_example.abc()

============================


2
Benim hatam python sürümleri hakkında olup olmadığını bilmiyorum. Bu örneği seçerek yaptığım import fn(uzantısız) ve bunları doğrudan ana dosyada kullanmaktır fn.my_funcion(). Ben kullandığımda import fn.pypy.py dosyasını yüklemeye çalışır, wich yok. Kullanmak from fn.py import funcnameda işe yaramadı. Teşekkür ederim.
m3nda

13

Modülü 'dosya' dışında bir adla yeniden adlandırın.

Ardından, şu işlevi çağırdığınızda da emin olun:

1) modülün tamamını içe aktarıyorsanız, modül adını çağırırken yinelersiniz:

import module
module.function_name()

veya

import pizza
pizza.pizza_function()

2) veya belirli işlevleri, takma adı olan işlevleri veya * kullanan tüm işlevleri içe aktarıyorsanız, modül adını tekrarlamazsınız:

from pizza import pizza_function
pizza_function()

veya

from pizza import pizza_function as pf
pf()

veya

from pizza import *
pizza_function()

9

.Py dosyasındaki işlevler (elbette farklı dizinde olabilir) önce dizinler ve sonra .py uzantısı olmayan dosya adı yazarak içe aktarılabilir:

from directory_name.file_name import function_name

Ve daha sonra kullanılmalıdır: function_name()


8

MathMethod.Py içinde.

def Add(a,b):
   return a+b 

def subtract(a,b):
  return a-b

İç Main.Py

import MathMethod as MM 
  print(MM.Add(200,1000))

Çıkış: 1200


6

Eklemek zorunda değilsiniz file.py.

Dosyayı içe aktarmak istediğiniz dosyayla aynı yerde tutmanız yeterlidir. Ardından işlevlerinizi içe aktarın:

from file import a, b

Ah emin değil. .Py yazmak istememiştim. Bu bir yazım hatası
Mohan

4

Dosyayı, almaya çalıştığınız Python dosyalarının bulunduğu yere sahip olmalısınız. Ayrıca 'dosya alma fonksiyonu' yeterlidir.


4

kodunuzu çalıştırdığınız dizinde bulunan bu dosyayı almak istiyorsanız, dosya adının önüne bir nokta (.) ekleyin.

Örneğin, a.py adında bir dosya çalıştırıyorum ve b.py ile yazılmış addFun adında bir yöntemi almak istiyorum ve b.py aynı dizinde var

.b import addFun sitesinden


2

Aramak istediğiniz dosyanın anotherfile.py olduğunu ve aramak istediğiniz yöntemin method1 olduğunu varsayalım, önce dosyayı içe aktarın ve ardından yöntemi

from anotherfile import method1

method1 bir sınıfın parçasıysa, sınıfın class1 olmasına izin verin,

from anotherfile import class1

sonra class1 nesnesini oluşturun, nesne adının ob1 olduğunu varsayalım

ob1 = class1()
ob1.method1()

2

benim durumumda dosyamı adlandırdım helper.scrap.pyve değiştirene kadar çalışmasını sağlayamadımhelper.py


1
Sahip olabileceğini sanmıyorum. veya - dosya adlarında
JeffCharter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.