Ketika saya menjalankan kode ini di python 2.7, saya mendapatkan kesalahan ini:
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
kodenya adalah:
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
dari skrip, Anda akan meletakkannya di direktori yang sama dengan skrip Anda misalnya. Jadi, Anda harus pindah ke direktori ini sebelum menjalankanfile.py
... Jadi, masih ada yang lebih baik yang dicari.Saya memiliki masalah yang sama dengan PyInstaller dan Py2exe, jadi saya menemukan resolusi di FAQ dari cx-freeze.
Saat menggunakan skrip Anda dari konsol atau sebagai aplikasi, fungsi di bawah ini akan memberikan Anda "jalur eksekusi", bukan "jalur file aktual":
Sumber:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Baris lama Anda (pertanyaan awal):
Gantikan baris kode Anda dengan cuplikan berikut.
Dengan kode di atas Anda dapat menambahkan aplikasi Anda ke jalur os Anda, Anda dapat menjalankannya di mana saja tanpa masalah bahwa aplikasi Anda tidak dapat menemukan file data / konfigurasinya.
Diuji dengan python:
sumber
ubah kode Anda sebagai berikut! itu berhasil untuk saya. `
sumber
os.getcwd()
, menurut doc , dan"__file__"
itu tidak ada artinya.__file__
" dan Anda menambahkan folder apa yang mungkin ada di dalamnya jika ada!Saya telah mengalami kasus di mana
__file__
tidak berfungsi seperti yang diharapkan. Tetapi hal berikut ini tidak mengecewakan saya sejauh ini:Ini adalah hal yang paling dekat analog Python untuk C
__FILE__
.Perilaku Python
__file__
jauh berbeda dari C__FILE__
. Versi C akan memberi Anda jalur asli dari file sumber. Ini berguna untuk mencatat kesalahan dan mengetahui file sumber mana yang memiliki bug.Python
__file__
hanya memberi Anda nama file yang saat ini dijalankan, yang mungkin tidak terlalu berguna dalam output log.sumber
os.path.dirname(os.path.realpath(...))
metodenya.Apakah Anda menggunakan penerjemah interaktif? Kamu bisa memakai
Anda harus membaca: Bagaimana cara mendapatkan jalur dari file yang dieksekusi saat ini dengan Python?
sumber
argv[1]
bukannyaargv[0]
Saya menyelesaikannya dengan memperlakukan file sebagai string, yaitu menempatkan
"__file__"
(bersama dengan tanda kutip!), Bukan__file__
Ini berfungsi dengan baik untuk saya:
sumber
"__file__"
antara tanda kutip diperlakukan berbeda dengan__file__
tanpa tanda kutip?"__file__"
. Misrealpath('nonexistentfile.whatever')
.Jika semua yang Anda cari adalah untuk mendapatkan direktori kerja Anda saat ini
os.getcwd()
akan memberikan Anda hal yang samaos.path.dirname(__file__)
selama Anda belum mengubah direktori kerja di tempat lain dalam kode Anda.os.getcwd()
juga bekerja dalam mode interaktif.Jadi
os.path.join(os.path.dirname(__file__))
jadilahos.path.join(os.getcwd())
sumber
os.path.dirname(__file__)
tidak melaporkan hal yang sama sepertios.getcwd()
. Apa yang diberikannya adalah nama dir dari file tersebut. Jika itu ternyata cocok,os.getcwd()
itu hanya kebetulan.Anda akan mendapatkan ini jika Anda menjalankan perintah dari shell python:
Anda perlu menjalankan file secara langsung, dengan meneruskannya sebagai argumen ke
python
perintah:Dalam kasus Anda, seharusnya begitu
python setup.py install
sumber
Yang dapat Anda lakukan adalah menggunakan yang berikut ini
Perhatikan di sini bahwa menggunakan string
'__file__'
memang mengacu pada variabel sebenarnya__file__
. Tentu saja Anda dapat mengujinya sendiri ..Bonus tambahan dari solusi ini adalah fleksibilitas ketika Anda menjalankan skrip sebagian secara interaktif (misalnya untuk menguji / mengembangkannya), dan dapat menjalankannya melalui baris perintah
sumber
'__file__'
adalah nama variabel yang valid, danif
kondisi Anda akan benar,os.path.realpath('__file__')
akan mengembalikan jalur palsu yang memperlakukan'__file__'
seolah-olah itu adalah nama file. Jika yang Anda butuhkan hanyalah melalui direktori induknyaos.path.dirname()
, Anda baik-baik saja - tetapi itu adalah "retas". @zwep__file__
dari dalam file sumber akan mendapatkan jalur dari file yang digunakan di dalamnya - ini tidak sama denganos.getcwd()
. Ini tidak akan selalu menjadiwk_dir
- atau direktori kerja Anda.Jika Anda menjalankan file melalui baris perintah, Anda dapat menggunakan peretasan ini
Ini bekerja untuk saya di konsol UnrealEnginePython, menelepon
py.exec myfile.py
sumber
Saya memiliki masalah yang sama di notebook Jupyter. Saat saya menggunakan 'os.path.split (os.path.realpath ( file ))', notebook mengalami kesalahan.
Jadi saya menggunakan ' file '. Ini bekerja dengan sempurna.
sumber
Saya mengalami masalah yang persis sama dan mungkin menggunakan tutorial yang sama . Definisi fungsi:
adalah buggy, karena
os.path.dirname(__file__)
tidak akan mengembalikan apa yang Anda butuhkan. Coba gantios.path.dirname(__file__)
denganos.path.dirname(os.path.abspath(__file__))
:Saya baru saja memposting Andrew bahwa potongan kode di dokumen saat ini tidak berfungsi, mudah-mudahan, ini akan diperbaiki.
sumber