web-dev-qa-db-ja.com

python NameError:グローバル名 '__file__'は定義されていません

python 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='[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']
      )
87
Kaibing Yang

このエラーは、pythonインタラクティブシェルにこの行os.path.join(os.path.dirname(__file__))を追加すると発生します。

Python Shell__file__の現在のファイルパスを検出せず、この行を追加したfilepathに関連しています

したがって、この行をfile.pyos.path.join(os.path.dirname(__file__))と書く必要があります。その後、python file.pyを実行します。ファイルパスを取得するため、動作します。

114
Nilesh

私はPyInstallerとPy2exeで同じ問題を抱えていたので、cx-freezeからFAQの解決策を見つけました。

コンソールから、またはアプリケーションとしてスクリプトを使用する場合、以下の機能は「実際のファイルパス」ではなく「実行パス」を提供します。

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)

上記のコードを使用すると、アプリケーションをOSのパスに追加でき、アプリがデータ/構成ファイルを見つけられないという問題なしに、どこでも実行できます。

Pythonでテスト済み:

  • 3.3.4
  • 2.7.13
13
Kwuite

ファイルを文字列として扱うことで解決しました。つまり、"__file__"の代わりに__file__を(引用符と一緒に!)入れます

これは私のためにうまくいきます:

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

インタラクティブインタープリターを使用していますか?使用できます

sys.argv[0]

読む必要があります: Pythonで現在実行されているファイルのパスを取得する方法?

9
Eloims

探しているのが現在の作業ディレクトリを取得することだけであれば、コードの他の場所で作業ディレクトリを変更していない限り、os.getcwd()os.path.dirname(__file__)と同じことを提供します。 os.getcwd()は対話モードでも動作します。

os.path.join(os.path.dirname(__file__))os.path.join(os.getcwd())になります

6
Andrew Fallgren

__file__が期待どおりに動作しない場合があります。しかし、次のことは今のところ私を失敗させていません:

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

あなたができることは、以下を使用することです

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__が実際に参照されることに注意してください。もちろん、これを自分でテストすることができます。

このソリューションの追加のボーナスは、スクリプトを部分的にインタラクティブに(たとえば、テスト/開発するために)実行し、コマンドラインから実行できる場合の柔軟性です。

2
zwep

pythonシェルからコマンドを実行している場合、これを取得します。

>>> __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
Burhan Khalid

次のようにコードを変更してください!わたしにはできる。 `

os.path.dirname(os.path.abspath("__file__"))
1
Jojo Josiane

コマンドライン経由でファイルを実行している場合、このハックを使用できます

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を呼び出して機能しました

0
crizCraig

私はまったく同じ問題を抱えており、おそらく 同じチュートリアル を使用しています。関数定義:

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

現在のドキュメントのコードスニペットが機能しないことをAndrewに投稿しました。うまくいけば修正されるでしょう。

0
ducin