Quando executo este código em python 2.7, recebo este erro:
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
o código é:
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']
)
file.py
partir de um script, você o colocaria no mesmo diretório do seu script, por exemplo. Portanto, você precisa mover para este diretório antes de executarfile.py
... Então, ainda algo melhor é procurado.Eu tive o mesmo problema com o PyInstaller e o Py2exe, então encontrei a resolução no FAQ do cx-freeze.
Ao usar seu script do console ou como um aplicativo, as funções a seguir fornecerão o "caminho de execução", não o "caminho real do arquivo":
Fonte:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Sua linha antiga (pergunta inicial):
Substitua sua linha de código pelo seguinte snippet.
Com o código acima, você pode adicionar seu aplicativo ao caminho do seu sistema operacional, você pode executá-lo em qualquer lugar sem o problema de seu aplicativo não conseguir encontrar seus arquivos de dados / configuração.
Testado com python:
fonte
mude seus códigos da seguinte maneira! funciona para mim. `
fonte
os.getcwd()
, de acordo com o doc , e"__file__"
não faz sentido.__file__
" e você adiciona a pasta onde ele poderia estar, se existisse!Já encontrei casos em
__file__
que não funciona conforme o esperado. Mas o seguinte não me falhou até agora:Esta é a coisa mais próxima de um análogo de Python para C do
__FILE__
.O comportamento do Python
__file__
é muito diferente do C de__FILE__
. A versão C fornecerá o caminho original do arquivo de origem. Isso é útil para registrar erros e saber qual arquivo de origem contém o bug.O Python
__file__
fornece apenas o nome do arquivo atualmente em execução, o que pode não ser muito útil na saída do log.fonte
os.path.dirname(os.path.realpath(...))
método.Você está usando o intérprete interativo? Você pode usar
Você deve ler: Como obtenho o caminho do arquivo executado no Python?
fonte
argv[1]
vez deargv[0]
Eu resolvi isso tratando o arquivo como uma string, ou seja, colocado
"__file__"
(junto com as aspas!) Em vez de__file__
Este trabalho é bom para mim:
fonte
"__file__"
tratamento entre aspas é diferente do que__file__
sem aspas?"__file__"
. Exrealpath('nonexistentfile.whatever')
.Se tudo o que você está procurando é obter seu diretório de trabalho atual,
os.getcwd()
isso lhe dará a mesma coisaos.path.dirname(__file__)
, contanto que você não tenha alterado o diretório de trabalho em outro lugar em seu código.os.getcwd()
também funciona no modo interativo.Então
os.path.join(os.path.dirname(__file__))
se tornaos.path.join(os.getcwd())
fonte
os.path.dirname(__file__)
não relata a mesma coisa queos.getcwd()
. O que ele fornece é o nome do diretório do arquivo. Se isso corresponderos.getcwd()
, é apenas uma coincidência.Você obterá isso se estiver executando os comandos do shell Python:
Você precisa executar o arquivo diretamente, passando-o como um argumento para o
python
comando:No seu caso, deveria realmente ser
python setup.py install
fonte
O que você pode fazer é usar o seguinte
Observe aqui que usar a string
'__file__'
realmente se refere à variável real__file__
. Você pode testar você mesmo, é claro ..O bônus adicional desta solução é a flexibilidade quando você está executando um script parcialmente interativamente (por exemplo, para testá-lo / desenvolvê-lo), e pode executá-lo através da linha de comando
fonte
'__file__'
é um nome de variável válido, e suaif
condição for verdadeira,os.path.realpath('__file__')
retornará um caminho falso tratando'__file__'
como se fosse o nome do arquivo. Se tudo que você precisa é seu diretório pai viaos.path.dirname()
, tudo bem - mas isso é um "hack". @zwep__file__
partir de um arquivo de origem obterá o caminho do arquivo no qual é usado - não é a mesma coisa queos.getcwd()
. Nem sempre será seuwk_dir
- ou diretório de trabalho.Se você está executando um arquivo via linha de comando, você pode usar este hack
Isso funcionou para mim no console UnrealEnginePython, chamando
py.exec myfile.py
fonte
Eu tive o mesmo problema no notebook Jupyter. Enquanto eu usava 'os.path.split (os.path.realpath ( file ))', o bloco de notas apresentava um erro.
Portanto, usei ' arquivo '. Funcionou perfeitamente.
fonte
Estou tendo exatamente o mesmo problema e provavelmente usando o mesmo tutorial . A definição da função:
é bugado, pois
os.path.dirname(__file__)
não retornará o que você precisa. Tente substituiros.path.dirname(__file__)
poros.path.dirname(os.path.abspath(__file__))
:Acabei de postar para Andrew que o trecho de código nos documentos atuais não funciona, espero que seja corrigido.
fonte