Ho usato per aprire i file che si trovavano nella stessa directory dello script Python attualmente in esecuzione semplicemente usando un comando simile
open("Some file.txt", "r")
Tuttavia, ho scoperto che quando lo script veniva eseguito in Windows facendo doppio clic su di esso, avrebbe tentato di aprire il file dalla directory errata.
Da allora ho usato un comando del modulo
open(os.path.join(sys.path[0], "Some file.txt"), "r")
ogni volta che volevo aprire un file. Questo funziona per il mio particolare utilizzo, ma non sono sicuro che sys.path[0]potrebbe non riuscire in qualche altro caso d'uso.
Quindi la mia domanda è: qual è il modo migliore e più affidabile per aprire un file che si trova nella stessa directory dello script Python attualmente in esecuzione?
Ecco cosa sono stato in grado di capire finora:
os.getcwd()eos.path.abspath('')restituisce la "directory di lavoro corrente", non la directory di script.os.path.dirname(sys.argv[0])eos.path.dirname(__file__)restituisce il percorso utilizzato per chiamare lo script, che può essere relativo o addirittura vuoto (se lo script è nel CWD). Inoltre,__file__non esiste quando lo script viene eseguito in IDLE o PythonWin.sys.path[0]eos.path.abspath(os.path.dirname(sys.argv[0]))sembra restituire la directory degli script. Non sono sicuro che ci sia differenza tra questi due.
Modificare:
Mi sono appena reso conto che ciò che voglio fare sarebbe meglio descritto come "apri un file nella stessa directory del modulo contenitore". In altre parole, se importare un modulo ho scritto che si trova in un'altra directory e quel modulo apre un file, voglio che cerchi il file nella directory del modulo. Non penso che nulla di ciò che ho trovato sia in grado di farlo ...
__file__non può essere utilizzato, utilizzaresys.argv[0]invece didirname(__file__). Il resto dovrebbe funzionare come previsto. Mi piace usarlo__file__perché nel codice della libreria,sys.argv[0]potrebbe non indicare affatto il tuo codice, specialmente se importato tramite uno script di terze parti.