Когда я запускаю этот код в 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='wehart@sandia.gov',
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']
)
file.py
из сценария вы должны поместить его, например, в тот же каталог, что и ваш сценарий. Таким образом, вам нужно перейти в этот каталог перед запускомfile.py
... Так что все еще ищется что-то получше.У меня была такая же проблема с PyInstaller и Py2exe, поэтому я наткнулся на разрешение в FAQ от cx-freeze.
При использовании сценария с консоли или в качестве приложения функции, описанные ниже, предоставят вам «путь выполнения», а не «фактический путь к файлу»:
Источник:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Ваша старая строка (начальный вопрос):
Замените свою строку кода следующим фрагментом.
С помощью приведенного выше кода вы можете добавить свое приложение в путь к вашей операционной системе, вы можете выполнять его где угодно без проблем, связанных с тем, что ваше приложение не может найти его файлы данных / конфигурации.
Протестировано на Python:
источник
измените свои коды следующим образом! меня устраивает. `
источник
os.getcwd()
, согласно документу , и"__file__"
это бессмысленно.__file__
" и вы добавляете, в какой папке он мог бы быть, если бы он существовал!Я сталкивался со случаями, когда
__file__
не работал должным образом. Но пока меня не подвело:Это ближе всего к аналогу Python в C - х
__FILE__
.Поведение Python
__file__
сильно отличается от C__FILE__
. Версия C предоставит вам исходный путь к исходному файлу. Это полезно для регистрации ошибок и определения того, в каком исходном файле есть ошибка.Python
__file__
дает вам только имя текущего исполняемого файла, что может быть не очень полезно при выводе журнала.источник
os.path.dirname(os.path.realpath(...))
методом.Вы пользуетесь интерактивным переводчиком? Ты можешь использовать
Вы должны прочитать: Как мне получить путь к текущему исполняемому файлу в Python?
источник
argv[1]
вместоargv[0]
Я решил это, обработав файл как строку, то есть поставил
"__file__"
(вместе с кавычками!) Вместо__file__
У меня это отлично работает:
источник
"__file__"
между кавычками обрабатывается иначе, чем__file__
без кавычек?"__file__"
. Напрrealpath('nonexistentfile.whatever')
.Если все, что вам нужно, это получить текущий рабочий каталог,
os.getcwd()
это даст вам то же самое,os.path.dirname(__file__)
если вы не изменили рабочий каталог где-либо еще в своем коде.os.getcwd()
также работает в интерактивном режиме.Так
os.path.join(os.path.dirname(__file__))
становитсяos.path.join(os.getcwd())
источник
os.path.dirname(__file__)
не сообщает о том же, что иos.getcwd()
. Это дает вам имя каталога файла. Если это окажется совпадением,os.getcwd()
это просто совпадение.Вы получите это, если запускаете команды из оболочки Python:
Вам нужно выполнить файл напрямую, передав его в качестве аргумента
python
команде:В вашем случае это действительно должно быть
python setup.py install
источник
Что вы можете сделать, так это использовать следующие
Обратите внимание, что использование строки
'__file__'
действительно относится к фактической переменной__file__
. Вы, конечно, можете проверить это сами ..Дополнительным бонусом этого решения является гибкость, когда вы запускаете сценарий частично в интерактивном режиме (например, для его тестирования / разработки) и можете запускать его через командную строку.
источник
'__file__'
пока - допустимое имя переменной, и вашеif
условие будет истинным,os.path.realpath('__file__')
вернет поддельный путь, обрабатываемый так,'__file__'
как если бы это было имя файла. Если все, что вам нужно, это его родительский каталогos.path.dirname()
, все в порядке, но это «взлом». @zwep__file__
из исходного файла будет получен путь к файлу, в котором он используется - это не то же самое, чтоos.getcwd()
. Это не всегда будет вашwk_dir
- или рабочий каталог.Если вы запускаете файл через командную строку, вы можете использовать этот прием
Это сработало для меня в консоли UnrealEnginePython, вызвав
py.exec myfile.py
источник
У меня была такая же проблема в ноутбуке Jupyter. Пока я использовал os.path.split (os.path.realpath ( file )), записная книжка выдавала ошибку.
Поэтому я использовал слово « файл ». Это сработало отлично.
источник
У меня точно такая же проблема, и я использую, вероятно, тот же учебник . Определение функции:
глючит, так
os.path.dirname(__file__)
как не вернет то, что нужно. Попробуйте заменитьos.path.dirname(__file__)
наos.path.dirname(os.path.abspath(__file__))
:Я только что написал Эндрю, что фрагмент кода в текущей документации не работает, надеюсь, он будет исправлен.
источник