অজগর নেম ত্রুটি: বিশ্বব্যাপী নাম '__file__' সংজ্ঞায়িত করা হয় না


112

আমি যখন পাইথন ২. I এ এই কোডটি চালাচ্ছি তখন আমি এই ত্রুটিটি পেয়েছি:

Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 30, in <module>
    long_description = read('README.txt'),
  File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 19, in read
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
NameError: global name '__file__' is not defined

কোডটি হ'ল:

import os
from setuptools import setup


def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()


setup(name="pyutilib.subprocess",
    version='3.5.4',
    maintainer='William E. Hart',
    maintainer_email='wehart@sandia.gov',
    url = 'https://software.sandia.gov/svn/public/pyutilib/pyutilib.subprocess',
    license = 'BSD',
    platforms = ["any"],
    description = 'PyUtilib utilites for managing subprocesses.',
    long_description = read('README.txt'),
    classifiers = [
        'Development Status :: 4 - Beta',
        'Intended Audience :: End Users/Desktop',
        'License :: OSI Approved :: BSD License',
        'Natural Language :: English',
        'Operating System :: Microsoft :: Windows',
        'Operating System :: Unix',
        'Programming Language :: Python',
        'Programming Language :: Unix Shell',
        'Topic :: Scientific/Engineering :: Mathematics',
        'Topic :: Software Development :: Libraries :: Python Modules'],
      packages=['pyutilib', 'pyutilib.subprocess', 'pyutilib.subprocess.tests'],
      keywords=['utility'],
      namespace_packages=['pyutilib'],
      install_requires=['pyutilib.common', 'pyutilib.services']
      )

উত্তর:


134

os.path.join(os.path.dirname(__file__))পাইথন ইন্টারেক্টিভ শেলটিতে আপনি এই লাইনটি যুক্ত করলে এই ত্রুটিটি আসে comes

Python Shellবর্তমান ফাইলের পথটি সনাক্ত করে না __file__এবং এটি আপনার সাথে সম্পর্কিত filepathযেখানে আপনি এই লাইনটি যুক্ত করেছেন

তাই আপনি যদি এই লাইন লেখা উচিত os.path.join(os.path.dirname(__file__))মধ্যে file.py। এবং তারপরে চালান python file.py, এটি কাজ করে কারণ এটি আপনার ফাইলপথ নেয়।


8
ঠিক আমার অভিজ্ঞতা। তবে কীভাবে এটি শেলের মধ্যে কাজ করা যায়?
s2t2

1
তবে file.pyকোনও স্ক্রিপ্ট থেকে চালানোর জন্য , আপনি উদাহরণ হিসাবে এটি আপনার স্ক্রিপ্টের মতো একই ডিরেক্টরিতে রেখে দেবেন। সুতরাং দৌড়ানোর আগে আপনাকে এই ডিরেক্টরিতে যেতে হবে file.py... সুতরাং আরও ভাল কিছু সন্ধান করা হবে।
ztyh

আপনি যখন সিসি করুন তখন ইমাকগুলি একটি ইন্টারেক্টিভ শেল ব্যবহার করে? পাইথন-শেল। এই শেলটি ব্যবহার করার কোনও উপায় কি যেন এটি ফাইল চালাচ্ছে টার্মিনাল? শেলটি চালানোর জন্য 3 টি বিকল্প রয়েছে: সিএমডি উত্সর্গীকৃত শো তাদের মধ্যে কেউ কি এটি করতে পারে?
সিনেকোনটা

18

পাইআইনস্টলার এবং পাই 2 এক্সিতে আমার একই সমস্যা ছিল তাই আমি সিএক্স-ফ্রিজ থেকে এফএকিউ-র রেজোলিউশনটি পেলাম।

কনসোল থেকে বা অ্যাপ্লিকেশন হিসাবে আপনার স্ক্রিপ্টটি ব্যবহার করার সময়, এখানে ফাংশনগুলি আপনাকে "বাস্তবায়ন পথ" সরবরাহ করবে, "প্রকৃত ফাইল পাথ" নয়:

print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(os.path.realpath('__file__')))

সূত্র:
http://cx-freeze.readthedocs.org/en/latest/faq.html

আপনার পুরানো রেখা (প্রাথমিক প্রশ্ন):

def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

নিম্নলিখিত স্নিপেটের সাথে আপনার কোডের লাইনটি প্রতিস্থাপন করুন।

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)

উপরের কোডের সাহায্যে আপনি আপনার অ্যাপ্লিকেশনটিকে আপনার ওএসের পথে যুক্ত করতে পারেন, আপনার অ্যাপ্লিকেশন এটির ডেটা / কনফিগারেশন ফাইলগুলি খুঁজে পেতে ব্যর্থ হয় এমন সমস্যা ছাড়াই আপনি এটি যে কোনও জায়গায় কার্যকর করতে পারেন।

অজগর দিয়ে পরীক্ষা করা:

  • 3.3.4
  • 2.7.13

12

নিম্নলিখিত হিসাবে আপনার কোড পরিবর্তন করুন! এটা আমার জন্য কাজ করে. `

os.path.dirname(os.path.abspath("__file__"))

7
আমি মনে করি আপনি ডকos.getcwd() অনুসারে ব্যবহার করছেন এবং এটি অর্থহীন। "__file__"
ডেভিডলতাও

5
কেন এই উপায়ে আছে? অনেক লোক এটি নিয়েছিল, এবং এটি একটি নিয়ন্ত্রণহীন ব্যতিক্রম থেকে মুক্তি পেয়েছে, তারা ধরে নিয়েছে যে এটি সঠিক ছিল ?? এটি কোনও সঠিক সমাধান মানুষ নয় । এটি যা করছে তা বলছে যে আপনার কাছে আক্ষরিক নামে একটি ফাইল রয়েছে " __file__" এবং আপনি যদি উপস্থিত
টড

11

আমি এমন ক্ষেত্রে ছুঁড়েছি যেখানে __file__প্রত্যাশা অনুযায়ী কাজ হয় না। কিন্তু নিম্নলিখিত এখনও পর্যন্ত আমাকে ব্যর্থ করেনি:

import inspect
src_file_path = inspect.getfile(lambda: None)

এটি সি এর সাথে পাইথন অ্যানালগের নিকটতম জিনিস __FILE__

পাইথনের আচরণ __file__সি এর থেকে অনেক আলাদা __FILE__। সি সংস্করণ আপনাকে উত্স ফাইলটির মূল পথ দেবে। লগিং ত্রুটিগুলি এবং কোন উত্স ফাইলটিতে বাগ রয়েছে তা জানার ক্ষেত্রে এটি দরকারী useful

পাইথন __file__আপনাকে কেবলমাত্র বর্তমানে সম্পাদনকারী ফাইলের নাম দেয় যা লগ আউটপুটে খুব কার্যকর নাও হতে পারে।


2
এই ওয়ার্কফর্মটি যখন পাইথনটি অন্য একটি অ্যাপ্লিকেশনটিতে এম্বেড করা হয়
sdaau

আমি os.path.dirname(os.path.realpath(...))পদ্ধতির চেয়ে এই সঙ্গে আরও ভাল ভাগ্য ছিল ।
মিঃ এস

1
এটি শীর্ষ উত্তর হওয়া উচিত।
183.amir

9

আপনি কি ইন্টারেক্টিভ দোভাষী ব্যবহার করছেন? তুমি ব্যবহার করতে পার

sys.argv[0]

আপনার পড়া উচিত: আমি পাইথনের বর্তমান সম্পাদিত ফাইলটির পথ কীভাবে পাব?


fd = os.path.dirname (os.path.relpath ( ফাইল )) এনডি মুদ্রণ এটি মুদ্রিত ... / .. / ফোল্ডার 1 / কিন্তু cwd = os.path.dirname (os.path.relpath (sys.argv [0 ])) >>> সিডব্লিউডি প্রিন্টগুলি প্রিন্ট করুন ../../
ব্রুসেপার্কার

7
এটি বাইনারি অজগরকে পাথ দেবে যা শেলটি চালু করেছিল, বর্তমান কার্যনির্বাহী ডিরেক্টরি নয়
hobs

এটি এর argv[1]পরিবর্তে হওয়া উচিতargv[0]
plustar

9

আমি ফাইলটিকে স্ট্রিং হিসাবে চিকিত্সা করে সমাধান করেছি, এর "__file__"পরিবর্তে (কোটগুলির সাথে একসাথে!) রাখি__file__

এটি আমার পক্ষে ভাল কাজ করে:

wk_dir = os.path.dirname(os.path.realpath('__file__'))

8
এটি আসলে কাজ করে, তবে কেন আমি মাথা ঘামাতে পারি না। "__file__"উদ্ধৃতিগুলির মধ্যে কোট __file__ছাড়াই আলাদা কেন ব্যবহার করা হয় ?
জিও

5
কারণ এটি অনুপস্থিত গ্লোবাল ভেরিয়েবলের উল্লেখ করে না। এর পরিবর্তে এটি STRING 'একইরূপে ফাইল পাথ অংশ হিসেবে'।
জোশভার্টি

42
এটি ফাইলটি যেখানে রয়েছে সেই ডিরেক্টরিটি ফিরিয়ে দেবে না , তবে কেবলমাত্র বর্তমান ওয়ার্কিং ডিরেক্টরিটি (যেখানে পাইথন বলা হয়) ফিরিয়ে দেয়। -1
জিয়ানগ্যু

8
যে কোনও ফাইলনাম এর জায়গায় করবে "__file__"। যেমন realpath('nonexistentfile.whatever')
hobs

35
এই উত্তরটি সত্যই এটি সরানো উচিত কারণ এটি ভুল এবং বিভ্রান্তিকর। এটি এত বেশি উত্সাহিত হয়েছে তা বরং উদ্বেগজনক ...
কাস

6

আপনি যা খুঁজছেন তা যদি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি os.getcwd()পেতে হয় তবে আপনি os.path.dirname(__file__)যতক্ষণ না আপনার কোডের অন্য কোনও জায়গায় ডিরেক্টরিটি পরিবর্তন করেন নি ততক্ষণ আপনি একই জিনিসটি সরবরাহ করবেন । os.getcwd()ইন্টারেক্টিভ মোডেও কাজ করে।

তাই os.path.join(os.path.dirname(__file__)) হয়ে যায় os.path.join(os.getcwd())


এটি একটি বিজয়ী
শান

1
এই উত্তরটি সঠিক নয়os.path.dirname(__file__)হিসাবে একই জিনিস রিপোর্ট না os.getcwd()। এটি আপনাকে যা দেয় তা হ'ল ফাইলটির নাম। যদি এটি মিলিয়ে যায় তবে os.getcwd()এটি কেবল কাকতালীয় ঘটনা।
টড

4

আপনি যদি পাইথন শেল থেকে কমান্ডগুলি চালাচ্ছেন তবে আপনি এটি পাবেন:

>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined

আপনার pythonকমান্ডের যুক্তি হিসাবে ফাইলটি সরাসরি চালনা করতে হবে :

$ python somefile.py

আপনার ক্ষেত্রে, এটি সত্যই হওয়া উচিত python setup.py install


2

আপনি যা করতে পারেন তা নিম্নলিখিতটি ব্যবহার করা

import os
if '__file__' in vars():
    wk_dir = os.path.dirname(os.path.realpath('__file__'))
else:
    print('We are running the script interactively')

এখানে নোট করুন যে স্ট্রিংটি ব্যবহার '__file__'করে প্রকৃত ভেরিয়েবলটি বোঝায় __file__। আপনি অবশ্যই এটি পরীক্ষা করতে পারেন ..

আপনি যখন আংশিক ইন্টারেক্টিভভাবে স্ক্রিপ্ট চালাচ্ছেন (যেমন এটি পরীক্ষা / বিকশিত করা), এবং কমান্ডলাইনের মাধ্যমে এটি চালাতে পারেন তখন এই সমাধানটির যুক্ত বোনাস হ'ল নমনীয়তা


আপনার নোট সম্পর্কিত, যখন '__file__'একটি বৈধ পরিবর্তনশীল নাম এবং আপনার ifঅবস্থা সত্য os.path.realpath('__file__')হবে , এমন একটি জাল পথ ফিরিয়ে দেবে '__file__'যেন এটি ফাইলের নাম। আপনার যা যা দরকার তা হ'ল তার মূল ডিরেক্টরি os.path.dirname()যদি হয় তবে আপনি ভাল আছেন - তবে এটি "হ্যাক"। @zwep
টড

__file__উত্স ফাইলের মধ্যে থেকে উল্লেখ করা এটির মধ্যে ব্যবহৃত ফাইলের পাথ পাবে - এটি একই জিনিস নয় os.getcwd()। এটি সর্বদা আপনার wk_dir- বা কাজের ডিরেক্টরি হবে না ।
টড

2

আপনি যদি কমান্ড লাইনের মাধ্যমে কোনও ফাইল চালাচ্ছেন তবে আপনি এই হ্যাকটি ব্যবহার করতে পারেন

import traceback

def get_this_filename():
    try:
        raise NotImplementedError("No error")
    except Exception as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        filename = traceback.extract_tb(exc_traceback)[-1].filename
    return filename

এটি কল করে আমার কাছে অবাস্তল ইঞ্জিনপাইথন কনসোলে কাজ করেছে py.exec myfile.py


1

জুপিটার নোটবুকে আমারও একই সমস্যা ছিল। আমি যখন 'os.path.split (os.path.relpath ( ফাইল ))' ব্যবহার করেছি, নোটবুকটি একটি ত্রুটি ছুঁড়েছিল ।

আমি এইভাবে ' ফাইল ' ব্যবহার করেছি । এটি পুরোপুরি কাজ করেছে।


0

আমার ঠিক একই সমস্যা রয়েছে এবং সম্ভবত একই টিউটোরিয়ালটি ব্যবহার করছি । ফাংশন সংজ্ঞা:

def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

বগী, যেহেতু os.path.dirname(__file__)আপনার যা প্রয়োজন তা ফেরত দেবে না এর os.path.dirname(__file__)সাথে প্রতিস্থাপনের চেষ্টা করুন os.path.dirname(os.path.abspath(__file__)):

def read(*rnames):
    return open(os.path.join(os.path.dirname(os.path.abspath(__file__)), *rnames)).read()

আমি কেবল অ্যান্ড্রু পোস্ট করেছি যে বর্তমান ডক্সে কোড স্নিপেট কাজ করে না, আশা করি, এটি সংশোধন করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.