python NameError: global name __file__ is not defined

python NameError: global name __file__ is not defined

This error comes when you append this line os.path.join(os.path.dirname(__file__)) in python interactive shell.

Python Shell doesnt detect current file path in __file__ and its related to your filepath in which you added this line

So you should write this line os.path.join(os.path.dirname(__file__)) in file.py. and then run python file.py, It works because it takes your filepath.

I had the same problem with PyInstaller and Py2exe so I came across the resolution on the FAQ from cx-freeze.

When using your script from the console or as an application, the functions hereunder will deliver you the execution path, not the actual file path:

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

Source:
http://cx-freeze.readthedocs.org/en/latest/faq.html

Your old line (initial question):

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

Substitute your line of code with the following snippet.

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)

With the above code you could add your application to the path of your os, you could execute it anywhere without the problem that your app is unable to find its data/configuration files.

Tested with python:

  • 3.3.4
  • 2.7.13

python NameError: global name __file__ is not defined

Ive run into cases where __file__ doesnt work as expected. But the following hasnt failed me so far:

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

This is the closest thing to a Python analog to Cs __FILE__.

The behavior of Pythons __file__ is much different than Cs __FILE__. The C version will give you the original path of the source file. This is useful in logging errors and knowing which source file has the bug.

Pythons __file__ only gives you the name of the currently executing file, which may not be very useful in log output.

Leave a Reply

Your email address will not be published. Required fields are marked *