كيفية استيراد ملفات Python الأخرى؟
-
23-09-2019 - |
سؤال
كيف يمكنني استيراد الملفات الأخرى في بيثون؟
- كيف يمكنني بالضبط استيراد ملف Python معين مثل
import file.py
? - كيف يمكنني استيراد مجلد بدلاً من ملف معين؟
- أرغب في تحميل ملف Python ديناميكيًا في وقت التشغيل ، استنادًا إلى إدخال المستخدم.
- أريد أن أعرف كيفية تحميل جزء واحد محدد فقط من الملف.
على سبيل المثال ، في 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)
تحديث: الإجابة أدناه عفا عليها الزمن. استخدم البديل الأحدث أعلاه.
مجرد
import file
بدون امتداد '.py'.يمكنك وضع علامة على مجلد كحزمة ، عن طريق إضافة ملف فارغ اسمه
__init__.py
.يمكنك استعمال ال
__import__
وظيفة. يأخذ اسم الوحدة النمطية كسلسلة. (مرة أخرى: اسم الوحدة بدون امتداد '.py'.)pmName = input('Enter module name:') pm = __import__(pmName) print(dir(pm))
يكتب
help(__import__)
لمزيد من التفاصيل.
نصائح أخرى
هناك العديد من الطرق لاستيراد ملف Python ، كل ذلك مع إيجابياتهم وسلبياتهم.
لا تقم فقط باختيار استراتيجية الاستيراد الأولى التي تناسبك وإلا سيتعين عليك إعادة كتابة قاعدة الشفرة لاحقًا عند العثور عليها لا تلبي احتياجاتك.
سأبدأ في شرح أسهل مثال رقم 1 ، ثم سأنتقل نحو المثال الأكثر احترافًا وقوة رقم 7
مثال 1 ، استيراد وحدة Python مع مترجم Python:
ضع هذا في /home/el/foo/fox.py:
def what_does_the_fox_say(): print("vixens cry")
ادخل إلى مترجم بيثون:
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 الآخر في المكان:
ضع هذا في /home/el/foo2/mylib.py:
def moobar(): print("hi")
ضع هذا في /home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py") moobar()
قم بتشغيل الملف:
el@apollo:/home/el/foo$ python main.py hi
تم استيراد وظيفة moobar من mylib.py وتوفير في Main.py
مثال 3 ، استخدم من ... استيراد ... الوظيفة:
ضع هذا في /home/el/foo3/chekov.py:
def question(): print "where are the nuclear wessels?"
ضع هذا في /home/el/foo3/main.py:
from chekov import question question()
قم بتشغيله مثل هذا:
el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?
إذا حددت وظائف أخرى في chekov.py ، فلن تكون متوفرة ما لم تكن أنت
import *
مثال 4 ، استيراد riaa.py إذا كان في موقع ملف مختلف من حيث يتم استيراده
ضع هذا في /home/el/foo4/stuff/riaa.py:
def watchout(): print "computers are transforming into a noose and a yoke for humans"
ضع هذا في /home/el/foo4/main.py:
import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout()
شغلها:
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 ، أقوى: استيراد الملفات في بيثون مع أمر الاستيراد العاري:
- اصنع دليلًا جديدًا
/home/el/foo5/
- اصنع دليلًا جديدًا
/home/el/foo5/herp
قم بعمل ملف فارغ اسمه
__init__.py
تحت هربس:el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
قم بعمل دليل جديد/الصفحة الرئيسية/EL/FOO5/HERP/DERP
تحت Derp ، اجعل آخر
__init__.py
ملف:el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py
تحت/الصفحة الرئيسية/EL/FOO5/HERP/DERP ، قم بعمل ملف جديد يسمى
yolo.py
ضع هذا هناك:def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!"
لحظة الحقيقة ، اصنع الملف الجديد
/home/el/foo5/main.py
, ، ضع هذا هناك ؛from herp.derp.yolo import skycake skycake()
شغلها:
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
- على سبيل المثال ، إذا كان ملفك يسمى القيد ABC.Py (استيراد ABC) هو أن ملفك يجب أن يكون موجودًا في نفس الموقع حيث يوجد نص Python Connect.
استيراد ABC
- على سبيل المثال ، إذا كان ملف Python الخاص بك داخل مجلد Windows. مجلد Windows موجود في نفس الموقع حيث يوجد نص Python.
من المجلد استيراد ABC
- incase ABC.Py Script متوفر Insider Internal_Folder الموجود داخل المجلد
من المجلد. internal_folder استيراد ABC
- كما أجابها جيمس أعلاه ، في حالة وجود ملفك في مكان ثابت
استيراد 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()