Lorsque j'exécute ce code en python 2.7, j'obtiens cette erreur:
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
le code est:
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 d'un script, vous le mettriez dans le même répertoire que votre script par exemple. Vous devez donc vous déplacer dans ce répertoire avant de démarrerfile.py
... Donc quelque chose de mieux est encore recherché.J'ai eu le même problème avec PyInstaller et Py2exe, donc je suis tombé sur la résolution sur la FAQ de cx-freeze.
Lorsque vous utilisez votre script depuis la console ou en tant qu'application, les fonctions ci-dessous vous fourniront le "chemin d'exécution", et non le "chemin réel du fichier":
Source:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Votre ancienne ligne (question initiale):
Remplacez votre ligne de code par l'extrait de code suivant.
Avec le code ci-dessus, vous pouvez ajouter votre application au chemin de votre système d'exploitation, vous pouvez l'exécuter n'importe où sans le problème que votre application est incapable de trouver ses fichiers de données / configuration.
Testé avec python:
la source
changez vos codes comme suit! ça marche pour moi. »
la source
os.getcwd()
, selon le doc , et cela"__file__"
n'a pas de sens.__file__
" et vous ajoutez dans quel dossier il pourrait se trouver s'il existait!J'ai rencontré des cas où
__file__
ne fonctionne pas comme prévu. Mais ce qui suit ne m'a pas laissé tomber jusqu'à présent:Ceci est le plus proche d'un analogue Python C de
__FILE__
.Le comportement de ce Python
__file__
est très différent de C de__FILE__
. La version C vous donnera le chemin d'origine du fichier source. Ceci est utile pour consigner les erreurs et savoir quel fichier source a le bogue.Python
__file__
ne vous donne que le nom du fichier en cours d'exécution, ce qui peut ne pas être très utile dans la sortie du journal.la source
os.path.dirname(os.path.realpath(...))
méthode.Utilisez-vous l'interprète interactif? Vous pouvez utiliser
Vous devriez lire: Comment obtenir le chemin du fichier exécuté en cours en Python?
la source
argv[1]
au lieu deargv[0]
Je l'ai résolu en traitant le fichier comme une chaîne, c'est-à-dire mis
"__file__"
(avec les guillemets!) Au lieu de__file__
Cela fonctionne bien pour moi:
la source
"__file__"
traitement entre guillemets est-il différent de celui__file__
sans guillemets?"__file__"
. Par exemplerealpath('nonexistentfile.whatever')
.Si tout ce que vous cherchez est d'obtenir votre répertoire de travail actuel, vous obtiendrez
os.getcwd()
la même chose tantos.path.dirname(__file__)
que vous n'avez pas changé le répertoire de travail ailleurs dans votre code.os.getcwd()
fonctionne également en mode interactif.Devient
os.path.join(os.path.dirname(__file__))
ainsios.path.join(os.getcwd())
la source
os.path.dirname(__file__)
ne rapporte pas la même chose queos.getcwd()
. Ce qu'il vous donne est le nom de répertoire du fichier. Si cela correspond,os.getcwd()
c'est simplement une coïncidence.Vous obtiendrez ceci si vous exécutez les commandes depuis le shell python:
Vous devez exécuter le fichier directement, en le passant comme argument à la
python
commande:Dans votre cas, cela devrait vraiment être
python setup.py install
la source
Ce que vous pouvez faire est d'utiliser les éléments suivants
Notez ici que l'utilisation de la chaîne
'__file__'
fait bien référence à la variable réelle__file__
. Vous pouvez bien sûr tester cela vous-même.Le bonus supplémentaire de cette solution est la flexibilité lorsque vous exécutez un script en partie de manière interactive (par exemple pour le tester / le développer), et pouvez l'exécuter via la ligne de commande
la source
'__file__'
est un nom de variable valide, et votreif
condition sera vraie,os.path.realpath('__file__')
retournera un faux chemin en traitant'__file__'
comme s'il s'agissait du nom du fichier. Si tout ce dont vous avez besoin est son répertoire parent viaos.path.dirname()
, tout va bien - mais c'est un "hack". @zwep__file__
partir d'un fichier source obtiendra le chemin du fichier dans lequel il est utilisé - ce n'est pas la même chose queos.getcwd()
. Ce ne sera pas toujours votrewk_dir
- ou votre répertoire de travail.Si vous exécutez un fichier via la ligne de commande, vous pouvez utiliser ce hack
Cela a fonctionné pour moi dans la console UnrealEnginePython, en appelant
py.exec myfile.py
la source
J'ai eu le même problème dans le notebook Jupyter. Alors que j'utilisais 'os.path.split (os.path.realpath ( file ))', le cahier lançait une erreur.
J'ai donc utilisé « fichier ». Cela a parfaitement fonctionné.
la source
J'ai exactement le même problème et j'utilise probablement le même tutoriel . La définition de la fonction:
est bogué, car
os.path.dirname(__file__)
ne retournera pas ce dont vous avez besoin. Essayez de remplaceros.path.dirname(__file__)
paros.path.dirname(os.path.abspath(__file__))
:Je viens de signaler à Andrew que l'extrait de code dans les documents actuels ne fonctionne pas, j'espère qu'il sera corrigé.
la source