Когда я запускаю этот код в 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']
)
Эта ошибка происходит, когда вы добавляете ОС этой линии.путь.присоединяйтесь к(ОС.путь.каталог(файл))` в Python интерактивной оболочки.
Оболочки Python
не'т получить путь к файлу в __File__, что и это'ы, связанные с вашим
путь_к_файлу`, в котором вы добавили эту строку
Поэтому вы должны написать ОС этой линии.путь.присоединяйтесь к(ОС.путь.каталог(файл)) " в " file.py. а затем запустить
питон file.py это работает, потому что он берет свой путь.
У меня была такая же проблема с PyInstaller и Py2exe так я наткнулась на разрешение на 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)
С выше код, вы могли бы добавить приложение на путь вашей операционной системы, вы можете выполнить его в любом месте без проблем, что ваше приложение не в состоянии найти его's данные/файлы конфигурации.
Тестирование с помощью Python:
Используете ли вы интерактивные переводчик? Вы можете использовать
sys.argv[0]
Вы должны прочитать: https://stackoverflow.com/questions/2632199/how-do-i-get-the-path-of-the-current-executed-file-in-python
Если все вы ищете, чтобы получить ОС вашего текущего рабочего каталога.функция getcwd () даст вам то же самое, что ОС.путь.каталог(файл) до тех пор, пока вы не меняли рабочую папку в другом месте в коде. `ОС.функция getcwd () также работает в интерактивном режиме.
Так
ОС.путь.присоединяйтесь к(ОС.путь.каталог(__файл__))
становится
ОС.путь.присоединяйтесь к(ОС.функция getcwd())
изменение кодов следующим образом! это работает для меня. `
os.path.dirname(os.path.abspath("__file__"))
Я'вэ бежать в случаях, когда __file__, что
не'т работать, как ожидалось. Но следующие еще'т мне не удалось до сих пор:
питон импорт проверить src_file_path = проверить.метод getfile(лямбда: нет)
Что вы можете сделать, это использовать следующие
import os
if '__file__' in vars():
wk_dir = os.path.dirname(os.path.realpath('__file__'))
else:
print('We are running the script interactively')
Здесь следует отметить, что, используя строку ' файл____'
действительно, обратитесь к фактической переменной файл____
. Вы можете проверить это сами, конечно..
Дополнительным бонусом такого решения является гибкость при выполнении сценария частично в интерактивном режиме (например, для тестирования/разработки), и может запустить его через командную строку
Вы получите это, если вы выполняете команды из оболочки Python:
>>> __file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined
Вам нужно запустить файл напрямую, передавая его в качестве аргумента в команде питон
:
$ python somefile.py
В вашем случае, это должно действительно быть `питон setup.py установить
Я'м, имея exacty же проблемы и с помощью, наверное, тот же учебник]1. Определение функции:
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
глючит, начиная с ОС.путь.каталог(файл)не будет возвращать то, что вам нужно. Попробовать ОС, заменив
.путь.каталог(файл)с
ОС.путь.каталог(ОС.путь.abspath(файл))`:
def read(*rnames):
return open(os.path.join(os.path.dirname(os.path.abspath(__file__)), *rnames)).read()
Я'вэ просто написал Андрей, что фрагмент кода в текущие документы не'т работу, надеюсь, это'll быть исправлены.
Если вы'вновь старпома'Инг файл через командную строку, вы можете использовать этот хак
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, называя пй.старпома myfile.py