سؤال

كيف يمكنني استيراد الملفات الأخرى في بيثون؟

  1. كيف يمكنني بالضبط استيراد ملف Python معين مثل import file.py?
  2. كيف يمكنني استيراد مجلد بدلاً من ملف معين؟
  3. أرغب في تحميل ملف Python ديناميكيًا في وقت التشغيل ، استنادًا إلى إدخال المستخدم.
  4. أريد أن أعرف كيفية تحميل جزء واحد محدد فقط من الملف.

على سبيل المثال ، في main.py أملك:

from extra import * 

على الرغم من أن هذا يعطيني كل التعريفات في extra.py, ، عندما يكون كل ما أريده هو تعريف واحد:

def gap():
    print
    print

ماذا أضيف إلى import بيان للحصول على فقط gap من عند extra.py?

هل كانت مفيدة؟

المحلول

importlib الإضافة الحديثة في Python لاستيراد وحدة نمطية برمجي. انها مجرد غلاف حول __import__ يرى https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

تحديث: الإجابة أدناه عفا عليها الزمن. استخدم البديل الأحدث أعلاه.

  1. مجرد import file بدون امتداد '.py'.

  2. يمكنك وضع علامة على مجلد كحزمة ، عن طريق إضافة ملف فارغ اسمه __init__.py.

  3. يمكنك استعمال ال __import__ وظيفة. يأخذ اسم الوحدة النمطية كسلسلة. (مرة أخرى: اسم الوحدة بدون امتداد '.py'.)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))
    

    يكتب help(__import__) لمزيد من التفاصيل.

نصائح أخرى

هناك العديد من الطرق لاستيراد ملف Python ، كل ذلك مع إيجابياتهم وسلبياتهم.

لا تقم فقط باختيار استراتيجية الاستيراد الأولى التي تناسبك وإلا سيتعين عليك إعادة كتابة قاعدة الشفرة لاحقًا عند العثور عليها لا تلبي احتياجاتك.

سأبدأ في شرح أسهل مثال رقم 1 ، ثم سأنتقل نحو المثال الأكثر احترافًا وقوة رقم 7

مثال 1 ، استيراد وحدة Python مع مترجم Python:

  1. ضع هذا في /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
    
  2. ادخل إلى مترجم بيثون:

    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 من خلال مترجم Python ، استدعت وظيفة Python what_does_the_fox_say() من داخل Fox.py.

مثال 2 ، استخدم execfile أو (exec في بيثون 3) في برنامج نصي لتنفيذ ملف Python الآخر في المكان:

  1. ضع هذا في /home/el/foo2/mylib.py:

    def moobar():
      print("hi")
    
  2. ضع هذا في /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
  3. قم بتشغيل الملف:

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

    تم استيراد وظيفة moobar من mylib.py وتوفير في Main.py

مثال 3 ، استخدم من ... استيراد ... الوظيفة:

  1. ضع هذا في /home/el/foo3/chekov.py:

    def question():
      print "where are the nuclear wessels?"
    
  2. ضع هذا في /home/el/foo3/main.py:

    from chekov import question
    question()
    
  3. قم بتشغيله مثل هذا:

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

    إذا حددت وظائف أخرى في chekov.py ، فلن تكون متوفرة ما لم تكن أنت import *

مثال 4 ، استيراد riaa.py إذا كان في موقع ملف مختلف من حيث يتم استيراده

  1. ضع هذا في /home/el/foo4/stuff/riaa.py:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
    
  2. ضع هذا في /home/el/foo4/main.py:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
    
  3. شغلها:

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

    أن يستورد كل شيء في الملف الأجنبي من دليل مختلف.

مثال 5 ، استخدم os.system("python yourfile.py")

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

مثال 6 ، استيراد ملفك عبر Piggybacking the Python Startuphook:

تحديث: يستخدم هذا المثال للعمل لكل من Python2 و 3 ، ولكن الآن يعمل فقط مع Python2. تخلصت Python3 من مجموعة ميزات Startuphook من المستخدمين لأنه تم إساءة معاملته من قبل كتاب مكتبة Python منخفضة المهارة ، باستخدامها لحقن رمزهم بشكل غير قانوني في مساحة الاسم العالمية ، قبل جميع البرامج المعرفة من قبل المستخدم. إذا كنت تريد أن يعمل هذا من أجل Python3 ، فسيتعين عليك أن تصبح أكثر إبداعًا. إذا أخبركم بكيفية القيام بذلك ، فسيقوم مطورو Python بتعطيل مجموعة الميزات هذه أيضًا ، لذلك أنت وحدك.

يرى: https://docs.python.org/2/library/user.html

ضع هذا الرمز في الدليل المنزلي الخاص بك في ~/.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 )

ضع هذا الرمز في Main.py (يمكن أن يكون في أي مكان):

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!")

قم بتشغيله ، يجب أن تحصل على هذا:

$ 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!

إذا حصلت على خطأ هنا: ModuleNotFoundError: No module named 'user' ثم يعني أنك تستخدم Python3 ، يتم تعطيل Startuphooks هناك افتراضيًا.

الفضل في هذا jist يذهب إلى: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py أرسل على طول القوارب الخاصة بك.

مثال 7 ، أقوى: استيراد الملفات في بيثون مع أمر الاستيراد العاري:

  1. اصنع دليلًا جديدًا /home/el/foo5/
  2. اصنع دليلًا جديدًا /home/el/foo5/herp
  3. قم بعمل ملف فارغ اسمه __init__.py تحت هربس:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
    
  4. قم بعمل دليل جديد/الصفحة الرئيسية/EL/FOO5/HERP/DERP

  5. تحت Derp ، اجعل آخر __init__.py ملف:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
    
  6. تحت/الصفحة الرئيسية/EL/FOO5/HERP/DERP ، قم بعمل ملف جديد يسمى yolo.py ضع هذا هناك:

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
    
  7. لحظة الحقيقة ، اصنع الملف الجديد /home/el/foo5/main.py, ، ضع هذا هناك ؛

    from herp.derp.yolo import skycake
    skycake()
    
  8. شغلها:

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

    فارغة __init__.py يتواصل الملف إلى مترجم Python الذي يعتزم المطور أن يكون هذا الدليل بمثابة حزمة قابلة للاستيراد.

إذا كنت ترغب في رؤية مشاركتي حول كيفية تضمين جميع ملفات .py ضمن دليل ، انظر هنا: https://stackoverflow.com/a/20753073/445131

لاستيراد ملف Python معين في "وقت التشغيل" باسم معروف:

import os
import sys

...

scriptpath = "../Test/MyModule.py"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

ليس لديك العديد من الطرق المعقدة لاستيراد ملف Python من مجلد إلى آخر. فقط إنشاء أ __init__.py ملف لإعلان هذا المجلد هو حزمة بيثون ثم انتقل إلى ملف المضيف الخاص بك حيث تريد استيراد اكتب فقط

from root.parent.folder.file import variable, class, whatever

استيراد المستند .. - رابط للرجوع إليه

ال __init__.py يُطلب من الملفات أن تجعل Python تعامل الدلائل على أنها تحتوي على حزم ، ويتم ذلك لمنع الدلائل ذات الاسم المشترك ، مثل String ، من إخفاء الوحدات الصالحة عن غير قصد تحدث لاحقًا على مسار البحث عن الوحدة النمطية.

__init__.py يمكن أن يكون ملفًا فارغًا فقط ، ولكن يمكنه أيضًا تنفيذ رمز التهيئة للحزمة أو تعيين ملف __all__ عامل.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

و

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

فيما يلي طريقتان بسيطتان فهمتهما الآن وتأكد من وجود ملف "file.py" الذي تريد استيراده كمكتبة في الدليل الحالي فقط.

أفضل طريقة لاستيراد ملفات .py هي عن طريق الطريق __init__.py. أبسط شيء يجب القيام به هو إنشاء ملف فارغ اسمه __init__.py في نفس الدليل الذي يقع ملفك.

هذه بريد بقلم مايك جرشي هو شرح رائع لـ __init__.py واستخدامه لصنع حزم بيثون ، واستيرادها ، وإعدادها.

كيف استيراد استيراد الملف واستخدام اختصار اسمه.

import DoStuff.py as DS
DS.main()

لا تنسى أن ملف الاستيراد الخاص بك يجب أن يكون تم تسميته مع .py extension

أرغب في إضافة هذه الملاحظة ، فأنا لا أفعل بوضوح في أي مكان آخر ؛ داخل وحدة/حزمة ، عند التحميل من الملفات ، يجب أن يكون اسم الوحدة/الحزمة مسبوقة بـ mymodule. يتصور mymodule كونه تخطيط مثل هذا:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

عند التحميل somefile.py/otherstuff.py من عند __init__.py يجب أن تبدو المحتويات مثل:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

الحالة الأولى: تريد استيراد الملف A.py في الملف B.py, ، هذان الملفان في نفس المجلد ، مثل هذا:

. 
├── A.py 
└── B.py

يمكنك القيام بذلك في الملف B.py:

import A

أو

from A import *

أو

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

ثم ستتمكن من استخدام جميع وظائف الملف A.py في الملف B.py


الحالة الثانية: تريد استيراد الملف folder/A.py في الملف B.py, ، هذان الملفان ليسا في نفس المجلد ، مثل هذا:

.
├── B.py
└── folder
     └── A.py

يمكنك القيام بذلك في الملف ب:

import folder.A

أو

from folder.A import *

أو

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

ثم ستتمكن من استخدام جميع وظائف الملف A.py في الملف B.py


ملخص: في الحالة الأولى ، ملف A.py هي الوحدة النمطية التي تستوردها في الملف B.py, ، استخدمت بناء الجملة import module_name. في الحالة الثانية ، folder هي الحزمة التي تحتوي على الوحدة النمطية A.py, ، استخدمت بناء الجملة import package_name.module_name.

لمزيد من المعلومات حول الحزم والوحدات النمطية ، راجع هذا حلقة الوصل.

فقط لاستيراد ملف Python في ملف Python آخر

لنقول إنني لدي Helper.py ملف Python الذي يحتوي على وظيفة عرض مثل ،

def display():
    print("I'm working sundar gsv")

في هذه اللحظة app.py, ، يمكنك استخدام وظيفة العرض ،

import helper
helper.display()

الإخراج ،

I'm working sundar gsv

ملاحظة: لا حاجة لتحديد امتداد .py.

قد يبدو هذا مجنونًا ، لكن يمكنك فقط إنشاء رابط رمزي للملف الذي تريد استيراده إذا كنت فقط إنشاء برنامج نصي Wrapper إليه.

يمكنك أيضًا القيام بذلك: from filename import something

مثال: from client import Clientلاحظ أنك لا تحتاج إلى .py .pyw .pyui تمديد.

في حالة وحدة تريد الاستيراد ليس في دليل فرعي, ، ثم جرب ما يلي وركض app.py من أعمق دليل الوالدين المشترك:

بنية الدليل:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

في app.py, ، إلحاق مسار العميل إلى sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

اختياري (إذا قمت بتحميل تكوينات على سبيل المثال) (يبدو أن التفتيش هو أقوى حالة لحالات الاستخدام الخاصة بي)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

يركض

user@host:/path/to/common_dir$ python3 application/app.py

هذا الحل يعمل بالنسبة لي في CLI ، وكذلك Pycharm.

هناك طريقتان لتشمل البرنامج النصي Python الخاص بك مع اسم ABC.Py

  1. على سبيل المثال ، إذا كان ملفك يسمى القيد ABC.Py (استيراد ABC) هو أن ملفك يجب أن يكون موجودًا في نفس الموقع حيث يوجد نص Python Connect.

استيراد ABC

  1. على سبيل المثال ، إذا كان ملف Python الخاص بك داخل مجلد Windows. مجلد Windows موجود في نفس الموقع حيث يوجد نص Python.

من المجلد استيراد ABC

  1. incase ABC.Py Script متوفر Insider Internal_Folder الموجود داخل المجلد

من المجلد. internal_folder استيراد ABC

  1. كما أجابها جيمس أعلاه ، في حالة وجود ملفك في مكان ثابت

استيراد OS
استيراد SYS
scriptpath = "../test/mymodule.py"
sys.path.append (os.path.abspath (scriptpath))
استيراد mymodule

في حالة تحديث البرنامج النصي Python الخاص بك ولا ترغب في تحميل - استخدم هذه العبارات لتحديث تلقائي. مكافأة :)

%load_ext autoreload 
%autoreload 2

هناك العديد من الطرق ، كما هو مذكور أعلاه ، لكنني أجد أنني فقط أريد استيراد محتويات ملف ، ولا تريد أن تكتب الخطوط والخطوط وعليها الاستيراد آخر الوحدات النمطية. لذا ، توصلت إلى طريقة للحصول على محتويات ملف ، حتى مع بناء جملة DOT (file.property) على عكس دمج الملف المستورد مع لك.
بادئ ذي بدء ، إليك ملفي الذي سأستورده ، data.py

    testString= "A string literal to import and test with"


ملحوظة: يمكنك استخدام .txt التمديد بدلا من ذلك.
في mainfile.py, ، ابدأ بالفتح والحصول على المحتويات.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

الآن لديك المحتويات كسلسلة ، ولكن تحاول الوصول إليها data.testString سوف يسبب خطأ ، مثل data هو مثال str الفصل ، وحتى لو كان لديه خاصية testString لن تفعل ما توقعته.
بعد ذلك ، قم بإنشاء فصل. على سبيل المثال (التورية المقصودة) ، ImportedFile

    class ImportedFile:

ووضع هذا فيه (مع المسافة البادئة المناسبة):

    exec(data)


وأخيرا ، إعادة تعيين data مثل ذلك:

    data=ImportedFile()

وهذا كل شيء! مجرد الوصول كما تفعل لأي وحدة أخرى ، والكتابة print(data.testString) سوف يطبع إلى وحدة التحكم A string literal to import and test with.
ومع ذلك ، إذا كنت تريد ما يعادل from mod import * ما عليك سوى إسقاط الفصل ، وتعيين المثيل ، و de-dent exec.

أتمنى أن يساعدك هذا:)
-بنجي

إذا كانت الوظيفة المحددة في ملف x.py:

def greet():
    print('Hello! How are you?')

في الملف الذي تقوم فيه باستيراد الوظيفة ، اكتب هذا:

from x import greet

هذا مفيد إذا كنت لا ترغب في استيراد جميع الوظائف في ملف.

هذه هي الطريقة التي فعلت بها لاستدعاء وظيفة من ملف Python ، وهذا مرن بالنسبة لي لاستدعاء أي وظائف.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)

ميزة واحدة غير معروفة للغاية من Python هي القدرة على الاستيراد zip الملفات:

library.zip
|-library
|--__init__.py

الملف __init__.py يحتوي الحزمة على ما يلي:

def dummy():
    print 'Testing things out...'

يمكننا كتابة نص آخر يمكنه استيراد حزمة من أرشيف الرمز البريدي. من الضروري فقط إضافة ملف zip إلى sys.path.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top