Kiedy uruchamiam ten kod w Pythonie 2.7, pojawia się ten błąd:
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
kod to:
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
ze skryptu, umieściłbyś go na przykład w tym samym katalogu, co skrypt. Więc musisz przejść do tego katalogu przed uruchomieniemfile.py
... Więc wciąż szuka się czegoś lepszego.Miałem ten sam problem z PyInstaller i Py2exe, więc natknąłem się na rozwiązanie w FAQ od cx-freeze.
Podczas korzystania ze skryptu z konsoli lub jako aplikacji funkcje opisane poniżej dostarczą „ścieżkę wykonywania”, a nie „rzeczywistą ścieżkę do pliku”:
Źródło:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Twoja stara linia (pytanie wstępne):
Zastąp wiersz kodu następującym fragmentem.
Za pomocą powyższego kodu możesz dodać aplikację do ścieżki swojego systemu operacyjnego, możesz ją uruchomić w dowolnym miejscu bez problemu, że Twoja aplikacja nie może znaleźć swoich plików danych / konfiguracyjnych.
Przetestowano w Pythonie:
źródło
zmień swoje kody w następujący sposób! mi to pasuje. `
źródło
os.getcwd()
, według doktora , i"__file__"
jest bez znaczenia.__file__
” i dodajesz na początku folder, w którym mógłby się on znajdować, gdyby istniał!Napotkałem przypadki, w których
__file__
nie działa zgodnie z oczekiwaniami. Ale jak dotąd nie zawiodły mnie:Jest to najbliższa rzecz do analogu Python C użytkownika
__FILE__
.Zachowanie Pythona
__file__
jest znacznie różni się od C użytkownika__FILE__
. Wersja C poda oryginalną ścieżkę do pliku źródłowego. Jest to przydatne w rejestrowaniu błędów i sprawdzaniu, który plik źródłowy zawiera błąd.Python
__file__
podaje tylko nazwę aktualnie wykonywanego pliku, co może nie być zbyt przydatne w danych wyjściowych dziennika.źródło
os.path.dirname(os.path.realpath(...))
metodą.Czy korzystasz z interaktywnego tłumacza? Możesz użyć
Powinieneś przeczytać: Jak uzyskać ścieżkę do aktualnie wykonywanego pliku w Pythonie?
źródło
argv[1]
zamiastargv[0]
Rozwiązałem to, traktując plik jako ciąg znaków, tj. Wstawiając
"__file__"
(razem z cudzysłowami!) Zamiast__file__
To działa dobrze dla mnie:
źródło
"__file__"
między cudzysłowami są traktowane inaczej niż__file__
bez cudzysłowów?"__file__"
. Nprealpath('nonexistentfile.whatever')
.Jeśli wszystko, czego szukasz, to pobranie bieżącego katalogu roboczego
os.getcwd()
, da ci to samo,os.path.dirname(__file__)
o ile nie zmienisz katalogu roboczego w innym miejscu w kodzie.os.getcwd()
działa również w trybie interaktywnym.Tak
os.path.join(os.path.dirname(__file__))
się stanieos.path.join(os.getcwd())
źródło
os.path.dirname(__file__)
nie zgłasza tego samego coos.getcwd()
. To, co daje, to nazwa katalogu pliku. Jeśli okaże się, żeos.getcwd()
to pasuje, to tylko zbieg okoliczności.Otrzymasz to, jeśli uruchamiasz polecenia z powłoki Pythona:
Musisz wykonać plik bezpośrednio, przekazując go jako argument do
python
polecenia:W twoim przypadku tak powinno być
python setup.py install
źródło
Co możesz zrobić, to użyć następujących
Zauważ tutaj, że użycie łańcucha
'__file__'
rzeczywiście odnosi się do rzeczywistej zmiennej__file__
. Oczywiście możesz to sprawdzić samodzielnie.Dodatkową zaletą tego rozwiązania jest elastyczność, gdy uruchamiasz skrypt częściowo interaktywnie (np. Aby go przetestować / opracować) i możesz go uruchomić za pomocą wiersza poleceń
źródło
'__file__'
jest prawidłową nazwą zmiennej, a twójif
warunek będzie prawdziwy,os.path.realpath('__file__')
zwróci fałszywą ścieżkę, traktując ją'__file__'
tak, jakby była to nazwa pliku. Jeśli wszystko, czego potrzebujesz, to jego katalog nadrzędny przezos.path.dirname()
, wszystko w porządku - ale to „hack”. @zwep__file__
z pliku źródłowego spowoduje pobranie ścieżki do pliku, w którym jest używany - to nie to samo, coos.getcwd()
. Nie zawsze będzie to Twójwk_dir
- lub katalog roboczy.Jeśli wykonujesz plik za pomocą wiersza poleceń, możesz użyć tego hacka
To zadziałało dla mnie w konsoli UnrealEnginePython, wywołując
py.exec myfile.py
źródło
Miałem ten sam problem w notatniku Jupyter. Podczas gdy użyłem „os.path.split (os.path.realpath ( plik ))”, notatnik zgłosił błąd.
Dlatego użyłem „ pliku ”. Działało idealnie.
źródło
Mam dokładnie ten sam problem i używam prawdopodobnie tego samego samouczka . Definicja funkcji:
jest wadliwy, ponieważ
os.path.dirname(__file__)
nie zwróci tego, czego potrzebujesz. Spróbuj wymienićos.path.dirname(__file__)
zos.path.dirname(os.path.abspath(__file__))
:Właśnie wysłałem Andrew, że fragment kodu w bieżących dokumentach nie działa, mam nadzieję, że zostanie poprawiony.
źródło