Cuando ejecuto este código en Python 2.7, aparece este error:
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
el código es:
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
desde un script, lo colocaría en el mismo directorio que su script, por ejemplo. Por lo tanto, debe moverse a este directorio antes de ejecutarfile.py
... Así que aún se busca algo mejor.Tuve el mismo problema con PyInstaller y Py2exe, así que encontré la resolución en las preguntas frecuentes de cx-freeze.
Cuando use su script desde la consola o como una aplicación, las funciones a continuación le entregarán la "ruta de ejecución", no la "ruta real del archivo":
Fuente:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Tu línea anterior (pregunta inicial):
Sustituya su línea de código con el siguiente fragmento.
Con el código anterior, puede agregar su aplicación a la ruta de su sistema operativo, puede ejecutarla en cualquier lugar sin el problema de que su aplicación no puede encontrar sus archivos de datos / configuración.
Probado con Python:
fuente
¡cambie sus códigos de la siguiente manera! esto funciona para mi. '
fuente
os.getcwd()
, según el documento , y no"__file__"
tiene sentido.__file__
" y antepone en qué carpeta podría estar si existiera.Me he encontrado con casos en los
__file__
que no funciona como se esperaba. Pero lo siguiente no me ha fallado hasta ahora:Esto es lo más parecido a un Python análogo a C's
__FILE__
.El comportamiento de Python
__file__
es muy diferente a la de C__FILE__
. La versión C le dará la ruta original del archivo fuente. Esto es útil para registrar errores y saber qué archivo fuente tiene el error.Python
__file__
solo le da el nombre del archivo que se está ejecutando actualmente, lo que puede no ser muy útil en la salida del registro.fuente
os.path.dirname(os.path.realpath(...))
método.¿Utiliza el intérprete interactivo? Puedes usar
Debería leer: ¿Cómo obtengo la ruta del archivo ejecutado actual en Python?
fuente
argv[1]
lugar deargv[0]
Lo resolví tratando el archivo como una cadena, es decir, poniendo
"__file__"
(¡junto con las comillas!) En lugar de__file__
Esto funciona bien para mi:
fuente
"__file__"
entre comillas se trata de manera diferente que__file__
sin comillas?"__file__"
. Ejrealpath('nonexistentfile.whatever')
.Si todo lo que está buscando es obtener su directorio de trabajo actual,
os.getcwd()
obtendrá lo mismoos.path.dirname(__file__)
siempre y cuando no haya cambiado el directorio de trabajo en otra parte de su código.os.getcwd()
también funciona en modo interactivo.Así se
os.path.join(os.path.dirname(__file__))
convierteos.path.join(os.getcwd())
fuente
os.path.dirname(__file__)
no informa lo mismo queos.getcwd()
. Lo que le da es el nombre de directorio del archivo. Si resulta coincidiros.getcwd()
, es simplemente una coincidencia.Obtendrá esto si está ejecutando los comandos desde el shell de Python:
Debe ejecutar el archivo directamente, pasándolo como argumento al
python
comando:En tu caso, debería ser
python setup.py install
fuente
Lo que puede hacer es utilizar lo siguiente
Tenga en cuenta aquí que el uso de la cadena de
'__file__'
hecho se refiere a la variable real__file__
. Puede probar esto usted mismo, por supuesto.La ventaja adicional de esta solución es la flexibilidad cuando ejecuta un script de forma parcialmente interactiva (por ejemplo, para probarlo / desarrollarlo) y puede ejecutarlo a través de la línea de comandos
fuente
'__file__'
es un nombre de variable válido, y suif
condición será verdadera,os.path.realpath('__file__')
devolverá una ruta falsa que se tratará'__file__'
como si fuera el nombre del archivo. Si todo lo que necesita es su directorio principal víaos.path.dirname()
, está bien, pero eso es un "truco". @zwep__file__
desde dentro de un archivo de origen, se obtendrá la ruta del archivo en el que se usa, no es lo mismo queos.getcwd()
. No siempre será suwk_dir
directorio o el del trabajo.Si está ejecutando un archivo a través de la línea de comando, puede usar este truco
Esto funcionó para mí en la consola UnrealEnginePython, llamando
py.exec myfile.py
fuente
Tuve el mismo problema en el cuaderno Jupyter. Mientras usaba 'os.path.split (os.path.realpath ( file ))', el cuaderno arrojaba un error.
Entonces usé ' archivo '. Funcionó perfectamente.
fuente
Estoy teniendo exactamente el mismo problema y probablemente estoy usando el mismo tutorial . La definición de función:
Tiene errores, ya
os.path.dirname(__file__)
que no devolverá lo que necesita. Intente reemplazaros.path.dirname(__file__)
conos.path.dirname(os.path.abspath(__file__))
:Acabo de publicar a Andrew que el fragmento de código en los documentos actuales no funciona, con suerte, se corregirá.
fuente