از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
نام “__file__” در پایتون تعریف نشده است
سرفصلهای مطلب
معرفی
پایتون، مانند هر زبان برنامه نویسی دیگری، مجموعه ای از ویژگی های عجیب و غریب خود را دارد. یکی از این ابهاماتی که اغلب توسعه دهندگان مبتدی را دچار مشکل می کند، خطای “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
در عوض عملکرد
ذخیره کد در ماژول های پایتون
یکی از راه های دور زدن 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