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.