Welke commando’s kan ik in Python gebruiken om te vinden:
- de huidige map (waar ik in de terminal was toen ik het Python-script uitvoerde), en
- waar is het bestand dat ik aan het uitvoeren ben?
Antwoord 1, autoriteit 100%
Om het volledige pad te krijgen naar de map waarin een Python-bestand zich bevindt, schrijft u dit in dat bestand:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
(Merk op dat de bovenstaande bezwering niet werkt als u os.chdir()
al hebt gebruikt om uw huidige werkmap te wijzigen, aangezien de waarde van de __file__
constante is relatief aan de huidige werkmap en wordt niet gewijzigd door een os.chdir()
aanroep.)
Om de huidige werkmap te krijgen, gebruik
import os
cwd = os.getcwd()
Documentatieverwijzingen voor de hierboven gebruikte modules, constanten en functies:
- De
os
enos.path
modules. - De
__file__
constante os.path.realpath(path)
(retourneert “het canonieke pad van de opgegeven bestandsnaam, waarbij alle symbolische koppelingen in het pad worden geëlimineerd”)os.path.dirname(path)
(retourneert “de mapnaam van padnaamPath
“)os.getcwd()
(retourneert “een string die de huidige werkdirectory vertegenwoordigt”)os.chdir(path)
( “wijzig de huidige werkmap inPath
“)
Antwoord 2, autoriteit 9%
Huidige werkmap: os.getcwd()
En het __file__
-kenmerk kan je helpen erachter te komen waar het bestand dat u uitvoert zich bevindt. Dit SO-bericht legt alles uit: Hoe krijg ik het pad van het huidige uitgevoerde bestand in Python?
Antwoord 3, autoriteit 8%
Misschien vindt u dit nuttig als referentie:
import os
print("Path at terminal when executing this file")
print(os.getcwd() + "\n")
print("This file path, relative to os.getcwd()")
print(__file__ + "\n")
print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")
print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")
print("This file directory only")
print(os.path.dirname(full_path))
Antwoord 4, autoriteit 4%
pathlib
-module, geïntroduceerd in Python 3.4 (PEP 428 De pathlib-module objectgeoriënteerde bestandssysteempaden), maakt padgerelateerde ervaring veel beter.
$ pwd
/home/skovorodkin/stack
$ tree
.
L-- scripts
+-- 1.py
L-- 2.py
Om de huidige werkmap te krijgen, gebruikt u Path.cwd()
:
from pathlib import Path
print(Path.cwd()) # /home/skovorodkin/stack
Om een absoluut pad naar uw scriptbestand te krijgen, gebruikt u Path.resolve()
methode:
print(Path(__file__).resolve()) # /home/skovorodkin/stack/scripts/1.py
En om het pad van een map te krijgen waar uw script zich bevindt, gaat u naar .parent
(het wordt aanbevolen om .resolve()
aan te roepen vóór .parent
):
print(Path(__file__).resolve().parent) # /home/skovorodkin/stack/scripts
Onthoud dat __file__
in sommige situaties niet betrouwbaar is: Hoe krijg ik het pad van het huidige uitgevoerde bestand in Python?.
Houd er rekening mee dat Path.cwd()
, Path.resolve()
en andere Path
-methoden padobjecten retourneren (PosixPath
in mijn geval), geen strings. In Python 3.4 en 3.5 veroorzaakte dat wat pijn, omdat open
De ingebouwde functie kon alleen werken met string- of bytes-objecten en ondersteunde geen Path
-objecten, dus je moest Path
-objecten converteren naar strings of Path.open()
methode, maar voor de laatste optie moest je de oude code wijzigen:
$ cat scripts/2.py
from pathlib import Path
p = Path(__file__).resolve()
with p.open() as f: pass
with open(str(p)) as f: pass
with open(p) as f: pass
print('OK')
$ python3.5 scripts/2.py
Traceback (most recent call last):
File "scripts/2.py", line 11, in <module>
with open(p) as f:
TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')
Zoals je kunt zien, werkt open(p)
niet met Python 3.5.
PEP 519 Een bestandssysteempadprotocol toevoegen, geïmplementeerd in Python 3.6, voegt ondersteuning toe van PathLike
maakt bezwaar tegen de functie open
, dus nu kan Path
objecten direct doorgeven aan de open
functie:
$ python3.6 scripts/2.py
OK
Antwoord 5, autoriteit 2%
1.Om het volledige pad van de huidige map te krijgen
>>import os
>>print os.getcwd()
o/p:”C :\Gebruikers\admin\mijnmap”
1.Om alleen de huidige mapnaam te krijgen
>>import os
>>str1=os.getcwd()
>>str2=str1.split('\\')
>>n=len(str2)
>>print str2[n-1]
o/p:”mijnmap”
Antwoord 6
Als u de huidige map probeert te vinden van het bestand waarin u zich momenteel bevindt:
OS-agnostische manier:
dirname, filename = os.path.split(os.path.abspath(__file__))
Antwoord 7
Pathlib kan op deze manier worden gebruikt om de map met het huidige script op te halen:
import pathlib
filepath = pathlib.Path(__file__).resolve().parent
Antwoord 8
Als je Python 3.4 gebruikt, is er de gloednieuwe pathlib
-module op een hoger niveau waarmee je gemakkelijk pathlib.Path.cwd()
kunt aanroepen om een Path
-object dat uw huidige werkdirectory vertegenwoordigt, samen met vele andere nieuwe functies.
Meer informatie over deze nieuwe API vindt u hier.
Antwoord 9
Om het volledige pad van de huidige map te krijgen:
os.path.realpath('.')
Antwoord 10
Antwoord op #1:
Als u de huidige directory wilt, doet u dit:
import os
os.getcwd()
Als je maar een willekeurige mapnaam wilt en je hebt het pad naar die map, doe dan dit:
def get_folder_name(folder):
'''
Returns the folder name, given a full folder path
'''
return folder.split(os.sep)[-1]
Antwoord op #2:
import os
print os.path.abspath(__file__)
Antwoord 11
Een beetje laat voor het feest, maar ik denk dat de meest beknopte manier om de naam van je huidige uitvoeringscontext te vinden, zou zijn
current_folder_path, current_folder_name = os.path.split(os.getcwd())
Antwoord 12
Als u zoekt naar de locatie van het momenteel uitgevoerde script, kunt u sys.argv[0]
gebruiken om het volledige pad te krijgen.
Antwoord 13
Gebruik voor vraag 1 os.getcwd() # get working dir
en os.chdir(r'D:\Steam\steamapps\common') # set working dir
Ik raad aan om sys.argv[0]
te gebruiken voor vraag 2 omdat sys.argv
onveranderlijk is en daarom altijd het huidige bestand retourneert (module objectpad) en niet wordt beïnvloed door os.chdir()
. Je kunt ook als volgt doen:
import os
this_py_file = os.path.realpath(__file__)
# vvv Below comes your code vvv #
maar dat fragment en sys.argv[0]
zullen niet werken of zullen raar werken wanneer het wordt gecompileerd door PyInstaller omdat magische eigenschappen niet zijn ingesteld op het niveau __main__
en sys.argv[0]
is de manier waarop je exe werd aangeroepen (betekent dat het wordt beïnvloed door de werkmap).