अजगर का नाम Name: वैश्विक नाम '__file__' परिभाषित नहीं है


112

जब मैं अजगर 2.7 में इस कोड को चलाता हूं, तो मुझे यह त्रुटि मिलती है:

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__))को अजगर इंटरएक्टिव शेल में जोड़ते हैं ।

Python Shellवर्तमान फ़ाइल पथ का पता नहीं लगाता है __file__और यह आपके से संबंधित हैfilepath जिसमें आपने यह पंक्ति जोड़ी है

तो अगर आप इस लाइन लिखना चाहिए os.path.join(os.path.dirname(__file__))में file.py। और फिर चलाएं python file.py, यह काम करता है क्योंकि यह आपकी फ़ाइलपथ लेता है।


8
बिल्कुल मेरा अनुभव। लेकिन इसे शेल के भीतर काम करने के लिए कैसे प्राप्त किया जाए?
s2t2

1
लेकिन file.pyएक स्क्रिप्ट से चलाने के लिए , आप इसे उसी स्क्रिप्ट में डालेंगे जैसे कि आपकी स्क्रिप्ट। तो आपको दौड़ने से पहले इस निर्देशिका में जाने की आवश्यकता है file.py... इसलिए अभी भी कुछ बेहतर मांगा गया है।
ztyh

तो Emcs एक इंटरेक्टिव शेल का उपयोग करता है जब आप Cc Cp? अजगर-खोल। क्या इस शेल का उपयोग करने का कोई तरीका है जैसे कि यह फ़ाइल चलाने वाला टर्मिनल था? शेल को चलाने के लिए 3 विकल्प हैं: CMD DEDICATED SHOW उनमें से एक ऐसा करेगा?
सीनकोनाटा

18

मुझे PyInstaller और Py2exe के साथ भी यही समस्या थी इसलिए मैं cx-freeze से अकसर किये गए सवाल पर प्रस्ताव पर आया था।

कंसोल से या किसी एप्लिकेशन के रूप में आपकी स्क्रिप्ट का उपयोग करते समय, यहां फ़ंक्शन आपको "निष्पादन पथ" प्रदान करेंगे, न कि "वास्तविक पथ":

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__"
davidlatwe

5
इसका उत्थान क्यों होता है? कि कई लोगों ने इसे लिया, और क्योंकि यह एक अखंड अपवाद से छुटकारा पा गया, उन्होंने इसे सही मान लिया था ?? यह लोगों का सही समाधान नहीं है । यह क्या कह रहा है कि आपके पास एक फ़ाइल है जिसका नाम शाब्दिक है, " __file__" और आप प्रिपेंड करते हैं कि यह मौजूद
टोड

11

मैंने उन मामलों में भाग लिया है जहाँ __file__अपेक्षा के अनुरूप काम नहीं होता है। लेकिन निम्नलिखित मुझे अब तक विफल नहीं हुआ है:

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

यह सी के लिए एक पायथन एनालॉग के लिए निकटतम चीज है __FILE__

पायथन का व्यवहार __file__C की तुलना में बहुत अलग है__FILE__ । सी संस्करण आपको स्रोत फ़ाइल का मूल पथ देगा। यह लॉगिंग त्रुटियों में उपयोगी है और यह जानने में कि किस स्रोत फ़ाइल में बग है।

पायथन __file__केवल आपको वर्तमान में निष्पादित फ़ाइल का नाम देता है, जो लॉग आउटपुट में बहुत उपयोगी नहीं हो सकता है।


2
यह कार्यरूप तब भी होता है जब अजगर दूसरे अनुप्रयोग में सन्निहित होता है
sadaau

मैं इस os.path.dirname(os.path.realpath(...))विधि की तुलना में बेहतर भाग्य था ।
श्री एस

1
यह शीर्ष उत्तर होना चाहिए।
183. आमिर

9

क्या आप इंटरएक्टिव इंटरप्रेटर का उपयोग कर रहे हैं? आप उपयोग कर सकते हैं

sys.argv[0]

आपको पढ़ना चाहिए: मुझे पायथन में वर्तमान निष्पादित फ़ाइल का मार्ग कैसे मिलेगा?


fd = os.path.dirname (os.path.realpath ( file )) nd प्रिंटिंग इसे प्रिंट किया गया ... / .. / folder1 / but cwd = os.path.dirname (os.path.realpath (sys.argv) [0] ])) >>> प्रिंट cwd प्रिंट
../../

7
यह शेल को लॉन्च करने वाले बाइनरी अजगर को रास्ता देगा, वर्तमान कार्यशील निर्देशिका नहीं
हॉब्स

इसके argv[1]बजायargv[0]
7

9

मैंने इसे एक स्ट्रिंग के रूप में फ़ाइल मानकर हल किया, "__file__"( यानी उद्धरण के साथ!) डाल दिया__file__

यह मेरे लिए ठीक काम करता है:

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

8
यह वास्तव में काम करता है, लेकिन मुझे अपना सिर क्यों नहीं मिला। "__file__"उद्धरणों के __file__बिना अलग-अलग व्यवहार क्यों किया जाता है ?
Gio

5
क्योंकि यह गायब वैश्विक चर का संदर्भ नहीं देता है। इसके बजाय यह स्ट्रिंग ' फ़ाइल ' को पथ का हिस्सा मानता है ।
जोशवर्ती

42
यह उस निर्देशिका को वापस नहीं करता है जहाँ फ़ाइल स्थित है, लेकिन बस वर्तमान कार्यशील निर्देशिका (जहाँ अजगर कहा जाता है) को लौटाएँ। -1
जियानग्यु

8
के स्थान पर कोई भी फ़ाइल नाम करेगा "__file__"। जैसे realpath('nonexistentfile.whatever')
hobs

35
यह उत्तर वास्तव में हटा दिया जाना चाहिए क्योंकि यह गलत और भ्रामक है। तथ्य यह है कि यह बहुत ऊंचा है बल्कि चिंतित है ...
Cas

6

सब आप देख रहे हैं प्राप्त करना है तो अपने वर्तमान कार्यशील निर्देशिका os.getcwd()के रूप में आप एक ही बात दे देंगे os.path.dirname(__file__)जब तक आप नहीं अपने कोड में कहीं और कार्यशील निर्देशिका बदल दिया है। os.getcwd()इंटरैक्टिव मोड में भी काम करता है।

तो os.path.join(os.path.dirname(__file__)) बन जाता है os.path.join(os.getcwd())


यह एक विजेता है
Shawn

1
यह उत्तर सही नहीं हैos.path.dirname(__file__)के रूप में एक ही बात की रिपोर्ट नहीं करता है os.getcwd()। यह आपको जो देता है वह फ़ाइल का dir नाम है। अगर 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(), आप ठीक हैं - लेकिन यह "हैक" है। @ ज़ीप
टोड

__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

यह मेरे लिए UnrealEnginePython कंसोल, कॉलिंग में काम करता है py.exec myfile.py


1

जुपिटर नोटबुक में भी मुझे यही समस्या थी। जबकि मैंने 'os.path.split (os.path.realpath ( फ़ाइल ) का उपयोग किया था ))' का उपयोग किया था, नोटबुक एक त्रुटि फेंक रहा था।

मैंने इस प्रकार ' फ़ाइल ' का उपयोग किया । इसने पूरी तरह से काम किया।


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()

मैंने अभी एंड्रयू को पोस्ट किया है कि वर्तमान डॉक्स में कोड स्निपेट काम नहीं करता है, उम्मीद है, इसे ठीक किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.