python NameError: global name '__file__' is not defined
当我在python 2.7中运行此代码时,我得到以下错误:
1 2 3 4 5 6 | 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 |
代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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='[email protected]', 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'] ) |
当您在python交互shell中附加此行
所以你应该在
我和PyInstaller和Py2Exe有同样的问题,所以我在cx Freeze的常见问题解答中找到了解决方案。
当从控制台或作为应用程序使用脚本时,下面的函数将为您提供"执行路径",而不是"实际文件路径":
1 2 3 | print(os.getcwd()) print(sys.argv[0]) print(os.path.dirname(os.path.realpath('__file__'))) |
来源:http://cx-freeze.readthedocs.org/en/latest/faq.html
您的旧行(初始问题):
1 2 | def read(*rnames): return open(os.path.join(os.path.dirname(__file__), *rnames)).read() |
用以下代码段替换您的代码行。
1 2 3 4 5 6 7 8 9 10 | 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) |
使用上述代码,您可以将应用程序添加到操作系统的路径,您可以在任何地方执行它,而不会出现应用程序无法找到其数据/配置文件的问题。
用python测试:
- 3.3.4
- 2.7.13
我把文件当作一个字符串来解决这个问题,即把
这对我来说很好:
1 | wk_dir = os.path.dirname(os.path.realpath('__file__')) |
你在使用交互式翻译程序吗?你可以使用
1 | sys.argv[0] |
您应该阅读:如何获取当前在python中执行的文件的路径?
如果您所要查找的只是获取当前工作目录,那么只要您没有在代码的其他地方更改工作目录,
所以
我遇到过文件不能按预期工作的情况。但到目前为止,以下几点并没有让我失望:
1 2 | import inspect src_file_path = inspect.getfile(lambda:None) |
你能做的就是使用以下
1 2 3 4 5 | import os if '__file__' in vars(): wk_dir = os.path.dirname(os.path.realpath('__file__')) else: print('We are running the script interactively') |
请注意,使用字符串
此解决方案的额外好处是,当您以部分交互方式运行脚本(例如测试/开发脚本)时,它具有灵活性,并且可以通过命令行运行脚本。
如果您正在运行来自python shell的命令,您将得到:
1 2 3 4 | >>> __file__ Traceback (most recent call last): File"<stdin>", line 1, in <module> NameError: name '__file__' is not defined |
您需要直接执行该文件,将其作为参数传递给
1 | $ python somefile.py |
在你的情况下,应该是
如果通过命令行执行文件,则可以使用此黑客
1 2 3 4 5 6 7 8 9 | 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 |
这对我来说是很有用的,在一个不可恢复的引擎里,我打电话给
更改代码如下!它对我有用。`
os.path.dirname(os.path.abspath("EDOCX1〔7]))
我正面临着同样的问题,可能也在使用同样的教程。功能定义:
1 2 | def read(*rnames): return open(os.path.join(os.path.dirname(__file__), *rnames)).read() |
是马车,因为
1 2 | def read(*rnames): return open(os.path.join(os.path.dirname(os.path.abspath(__file__)), *rnames)).read() |
我刚刚发布了安德鲁的文章,说当前文档中的代码片段不起作用,希望它能被纠正。