وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

نام “__file__” در پایتون تعریف نشده است

0 8
زمان لازم برای مطالعه: 4 دقیقه


معرفی

پایتون، مانند هر زبان برنامه نویسی دیگری، مجموعه ای از ویژگی های عجیب و غریب خود را دارد. یکی از این ابهاماتی که اغلب توسعه دهندگان مبتدی را دچار مشکل می کند، خطای “NameError: name ‘__file__’ is not defined” است. دقیقا چیه __file__? چرا در برخی زمینه ها تعریف می شود اما در برخی دیگر تعریف نمی شود؟

این Byt به شما در درک این خطا، چرایی بروز آن و روش رفع آن کمک می کند.

این خطا به چه معناست؟

را __file__ ویژگی در پایتون یک ویژگی داخلی است که به طور خودکار روی مسیر فایل ماژول که اسکریپت از آن بارگذاری می شود تنظیم می شود. این ویژگی زمانی مفید است که می‌خواهید مکان اسکریپت فعلی را بدانید، به خصوص زمانی که با مسیرهای فایل نسبی سروکار دارید. با این حال، زمانی که سعی می کنید دسترسی داشته باشید __file__ در پوسته تعاملی پایتون یا نوت بوک Jupyter، ممکن است با خطای “NameError: name ‘__file__’ is not defined” مواجه شوید. این بخاطر این است که __file__ در این محیط ها تعریف نشده است.

print(__file__)
NameError: name '__file__' is not defined

دسترسی فایل در یک پوسته تعاملی

پوسته تعاملی پایتون یک ابزار عالی برای آزمایش سریع و کثیف قطعات کد است. با این حال، آن را نمی کند حمایت کنید __file__ ویژگی، زیرا با هیچ فایلی مرتبط نیست. اگر سعی می کنید دسترسی داشته باشید __file__ در یک پوسته تعاملی، شما یک را دریافت خواهید کرد NameError همانطور که در بالا نشان داده شده.

توجه داشته باشید: اگر نیاز به دریافت دایرکتوری اسکریپت فعلی در یک پوسته تعاملی دارید، می توانید از آن استفاده کنید os ماژول ها getcwd در عوض عملکرد

پیشنهاد می‌کنیم بخوانید:  مقایسه Datetimes در پایتون با و بدون Timezones

ذخیره کد در ماژول های پایتون

یکی از راه های دور زدن NameError هنگام تلاش برای دسترسی __file__ این است که کد خود را به جای اجرای آن در پوسته تعاملی در یک ماژول پایتون ذخیره کنید. یک ماژول پایتون به سادگی یک فایل حاوی تعاریف و عبارات پایتون است. نام فایل نام ماژول با پسوند است .py اضافه. وقتی تو import یک ماژول، پایتون کد را در ماژول اجرا می کند و آن را برای استفاده در دسترس شما قرار می دهد.


print(__file__)

حالا اگر شما import این ماژول از اسکریپت دیگر یا از پوسته تعاملی، __file__ تعریف خواهد شد:


import mymodule
/path/to/mymodule.py

با استفاده از بازرسی مدول

راه دیگر برای دریافت مسیر فایل در یک پوسته تعاملی استفاده از آن است inspect مدول. را inspect ماژول چندین عملکرد را برای کمک به دریافت اطلاعات در مورد اشیاء زنده مانند ماژول ها، کلاس ها، متدها، توابع و غیره ارائه می دهد. می توانید از getfile تابع برای دریافت فایلی که یک شی در آن تعریف شده است.

import inspect
print(inspect.getfile(inspect.currentframe()))

این مسیر فایل اسکریپت فعلی را چاپ می کند، حتی زمانی که از یک پوسته تعاملی اجرا شود. با این حال، به خاطر داشته باشید که این باز خواهد گشت <stdin> در یک پوسته تعاملی، زیرا اسکریپت در واقع از ورودی استاندارد خوانده می شود.

دریافت فهرست کاری فعلی با os.getcwd()

وقتی با مسیرهای فایل در پایتون سر و کار دارید، دانستن دایرکتوری کاری فعلی اغلب مفید است. این دایرکتوری است که اسکریپت شما از آنجا اجرا می شود. پایتون os ماژول روشی به نام ارائه می دهد getcwd() که دایرکتوری کاری فعلی را به عنوان یک رشته برمی گرداند.

در اینجا روش استفاده از آن آورده شده است:

import os

print(os.getcwd())

با اجرای این کد چیزی شبیه به:

$ python3 getcwd_example.py
/Users/username/Documents/my_project

این نشان می دهد که فیلمنامه getcwd_example.py در حال اجرا است از /Users/username/Documents/my_project فهرست راهنما.

پیشنهاد می‌کنیم بخوانید:  آموزش تجارت الگوریتمی با استفاده از پایتون

دریافت نام ماژول با sys.argv

را sys ماژول در پایتون دسترسی به برخی از متغیرهای مورد استفاده یا نگهداری شده توسط مفسر پایتون را فراهم می کند. یکی از اینهاست sys.argv، که یک لیست در پایتون است که شامل command-line آرگومان های ارسال شده به اسکریپت اولین مورد در این لیست، sys.argv(0)، همیشه نام خود اسکریپت است.

بیایید آن را در عمل ببینیم:

import sys

print(sys.argv(0))

اگر این اسکریپت را به صورت اجرا کنید python3 argv_example.py، خواهی دید:

$ python3 argv_example.py
argv_example.py

همانطور که می بینید، sys.argv(0) نام اسکریپتی را که در حال حاضر در حال اجراست به ما می دهد.

قطعا! در اینجا یک نسخه اصلاح شده از بخشی است که تمرکز دارد روی دسترسی به __file__ صفت روی ماژول های وارد شده در زمینه عنوان مقاله:

دسترسی به __file__ صفت روی ماژول های وارداتی

وقتی تو import یک ماژول، نه تنها توابع، کلاس ها و متغیرها در حافظه بارگذاری می شوند، بلکه ویژگی های خاص خاصی نیز در دسترس هستند. یکی از این ویژگی ها این است __file__، که می تواند اطلاعاتی را ارائه دهد روی محل فایل منبع ماژول.

در اینجا روش دسترسی به آن در یک مورد معمول آمده است. فرض کنید یک ماژول به نام دارید my_module واقع شده در /path/to/my_module.py:


def hello_world():
    print("Hello, world!")

تو می توانی import این ماژول و سپس به آن دسترسی پیدا کنید __file__ ویژگی برای دیدن مسیری که ماژول در آن ذخیره می شود:

import my_module

print(my_module.__file__)

وقتی این اسکریپت را اجرا می کنید، خواهید دید:

$ python3 import_example.py
/path/to/my_module.py

همانطور که می بینید، ما توانستیم به آن دسترسی پیدا کنیم __file__ ویژگی از یکی دیگر ماژول، خارج از اسکریپتی که در حال حاضر اجرا می شود.

نتیجه

در این بایت، ما چندین راه را برای حل مشکل بررسی کرده ایم
خطای “NameError: name ‘__file__’ is not defined” در پایتون. ما یاد گرفتیم که چگونه با استفاده از دایرکتوری کاری فعلی به دست آوریم os.getcwd()، نام ماژول را با استفاده از آن تعیین کنید sys.argvو به ویژگی ها دسترسی داشته باشید روی ماژول های وارداتی

(برچسب‌ها به ترجمه)# python



منتشر شده در 1402-12-29 20:21:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید