Find the current directory and file's directory [duplicate]
Asked Answered
A

13

2999

How do I determine:

  1. the current directory (where I was in the shell when I ran the Python script), and
  2. where the Python file I am executing is?
Allowance answered 28/2, 2011 at 1:51 Comment(4)
import os cwd = os.getcwd() to pwd within pythonDecrepitude
This question is blatantly two questions in one and should have been closed as needing more focus. Both questions are simple reference questions, and thus ought to each have separate canonicals that this can be dupe-hammered with. However, I have been absolutely tearing my hair out trying to find a proper canonical for only the first question. I am turning up countless duplicates for the second question, most of which involve OP not realizing there is a difference.Wiper
I have added the best I could find for "Q. How do I determine the current directory? A. Use os.getcwd()" after literally hours of searching. Ugh.Wiper
if you are just trying to get the current folder name without full path then you can try this : os.path.basename(<path>)Coparcenary
G
4668

To get the full path to the directory a Python file is contained in, write this in that file:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))

(Note that the incantation above won't work if you've already used os.chdir() to change your current working directory, since the value of the __file__ constant is relative to the current working directory and is not changed by an os.chdir() call.)


To get the current working directory use

import os
cwd = os.getcwd()

Documentation references for the modules, constants and functions used above:

Grindlay answered 28/2, 2011 at 1:54 Comment(14)
I hate it when I use this to append to sys.path. I feel so dirty right now.Calendre
file will not work if invoked from an IDE (say IDLE). Suggest os.path.realpath('./') or os.getcwd(). Best anser in here: #2632699Macadamia
@Macadamia might suit some needs, but I feel it should be noted that those things aren't the same at all - files can be outside the working directory.Roo
What about reversing the order, does it matter? os.path.realpath(os.path.dirname(__file__))Tricotine
@Tricotine Often the paths will be the same when reversing realpath with dirname, but it will differ when the file (or its directory) is actually a symbolic link.Naoise
It gets an error NameError: name '__file__' is not defined. How to solve this?Adulteration
Apparently prepending to sys.path is acceptable according to the documentation.Faze
In some versions of python 2 (mainly windows versions) paths that include utf-8 characters (like emojis) will return with two question marks replacing the character from os functions, messing up any further commands that you try.Jesu
@RusselDias why do you put realpath inside dirname? I tested each independently and they work like charm!Precinct
@MohammadElNesr are you sure that you're using os.path.realpath and not os.path.abspath? you're error eften occurs with abspath.Precinct
for jupyter notebooks - try os.path.realpath(os.getcwd()) (when you're in the right working directory)Heimer
os.path.dirname(__file__) do the same that os.path.dirname(os.path.realpath(__file__)) in my codeSparge
Just make sure you use "__file__"Rhonarhonchus
I don't think the first parenthesis is correct at all. __file__ seems to be absolute, not relative to the CWDTuantuareg
E
384

Current working directory: os.getcwd()

And the __file__ attribute can help you find out where the file you are executing is located. This Stack Overflow post explains everything: How do I get the path of the current executed file in Python?

Excommunication answered 28/2, 2011 at 1:53 Comment(0)
L
362

You may find this useful as a reference:

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))
Lardon answered 5/12, 2012 at 10:18 Comment(2)
what does __file__ signifies here? It does not work for me.Rianon
The __file__ is an attribute of the module object. You need run the code inside a Python file, not on the REPL.Lardon
N
305

The pathlib module, introduced in Python 3.4 (PEP 428 — The pathlib module — object-oriented filesystem paths), makes the path-related experience much much better.

pwd

/home/skovorodkin/stack

tree

.
└── scripts
    ├── 1.py
    └── 2.py

In order to get the current working directory, use Path.cwd():

from pathlib import Path

print(Path.cwd())  # /home/skovorodkin/stack

To get an absolute path to your script file, use the Path.resolve() method:

print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py

And to get the path of a directory where your script is located, access .parent (it is recommended to call .resolve() before .parent):

print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts

Remember that __file__ is not reliable in some situations: How do I get the path of the current executed file in Python?.


Please note, that Path.cwd(), Path.resolve() and other Path methods return path objects (PosixPath in my case), not strings. In Python 3.4 and 3.5 that caused some pain, because open built-in function could only work with string or bytes objects, and did not support Path objects, so you had to convert Path objects to strings or use the Path.open() method, but the latter option required you to change old code:

File 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')

Output

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')

As you can see, open(p) does not work with Python 3.5.

PEP 519 — Adding a file system path protocol, implemented in Python 3.6, adds support of PathLike objects to the open function, so now you can pass Path objects to the open function directly:

python3.6 scripts/2.py

OK
Newell answered 5/9, 2017 at 19:14 Comment(3)
Note also that these methods are chainable, so you can use app_path = Path(__file__).resolve().parent.parent.parent as a parallel to ../../../ if you need to.Beginning
What system has executables (or the equivalent) by the name "python3.5" and "python3.6"? Ubuntu Ubuntu MATE 20.04 (Focal Fossa) doesn't (at least not by default). It has executables by the name "python3" and "python2" (but not "python" - which causes some things to break)Polston
@PeterMortensen, thanks for the corrections. I don't remember if I actually had python3.x symlinks that time. Maybe I thought it would make snippets a bit clearer to the reader.Newell
B
83
  1. To get the current directory full path

    >>import os
    >>print os.getcwd()
    

    Output: "C :\Users\admin\myfolder"

  2. To get the current directory folder name alone

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]
    

    Output: "myfolder"

Brevity answered 24/4, 2012 at 7:0 Comment(4)
better do it in one line, i think: os.getcwd().split('\\')[-1]Tourneur
better to use os.sep rather than hardcode for Windows: os.getcwd().split(os.sep)[-1]Raguelragweed
the problem with this approach is that if you execute the script from a different directory, you will get that directory's name instead of the scripts', which may not be what you want.Pauperism
Right, the current directory which hosts your file may not be your CWDCorin
S
60

Pathlib can be used this way to get the directory containing the current script:

import pathlib
filepath = pathlib.Path(__file__).resolve().parent
Seymourseys answered 29/9, 2016 at 13:7 Comment(6)
I like this solution. However can cause some Python 2.X issues.Swaney
For python 3.3 and earlier pathlib has to be installedSculpturesque
@Kimmo The only reason you should be working in Python 2 code is to convert it to Python 3.Marcusmarcy
@kagnirick agreed, but there are still people who don't. I write all my new stuff with formatted string literals (PEP 498) using Python 3.6 so that someone doesn't go and push them to Python2.Swaney
Note also that these methods are chainable, so you can use app_path = Path(__file__).resolve().parent.parent.parent as a parallel to ../../../ if you need to.Beginning
when i run the code in jupyter notebook, it has the error: NameError: name '__file__' is not defined, how to solve?Teece
I
44

If you are trying to find the current directory of the file you are currently in:

OS agnostic way:

dirname, filename = os.path.split(os.path.abspath(__file__))
Interpellant answered 7/10, 2012 at 9:10 Comment(0)
M
39

If you're using Python 3.4, there is the brand new higher-level pathlib module which allows you to conveniently call pathlib.Path.cwd() to get a Path object representing your current working directory, along with many other new features.

More info on this new API can be found here.

Mien answered 20/2, 2015 at 20:32 Comment(1)
For Python version < 3.4 you can use pathlib2: pypi.python.org/pypi/pathlib2Minister
M
39

To get the current directory full path:

os.path.realpath('.')
Margret answered 22/9, 2015 at 8:12 Comment(5)
This one works from inside a jupyter iPython notebook (´__file__´ and getcwd won't)Ictinus
Still valid. Thanks from the future @OliverZendel!Torrie
I'm working remotely with a Jupyter Notebook: os.getcwd() and `os.path.realpath('.') return exactly the same string path.Susiesuslik
@Leevo: Point being?Polston
This returns the jupyter root directory, not the directory holding the file.Cedillo
H
35

Answer to #1:

If you want the current directory, do this:

import os
os.getcwd()

If you want just any folder name and you have the path to that folder, do this:

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]

Answer to #2:

import os
print os.path.abspath(__file__)
Hahn answered 5/11, 2015 at 9:31 Comment(0)
B
31

I think the most succinct way to find just the name of your current execution context would be:

current_folder_path, current_folder_name = os.path.split(os.getcwd())
Bethina answered 9/10, 2013 at 10:31 Comment(0)
D
18

If you're searching for the location of the currently executed script, you can use sys.argv[0] to get the full path.

Dang answered 12/8, 2013 at 11:27 Comment(1)
This is wrong. sys.argv[0] needn't contain the full path to the executing script.Obloquy
A
18

For question 1, use os.getcwd() # Get working directory and os.chdir(r'D:\Steam\steamapps\common') # Set working directory


I recommend using sys.argv[0] for question 2 because sys.argv is immutable and therefore always returns the current file (module object path) and not affected by os.chdir(). Also you can do like this:

import os
this_py_file = os.path.realpath(__file__)

# vvv Below comes your code vvv #

But that snippet and sys.argv[0] will not work or will work weird when compiled by PyInstaller, because magic properties are not set in __main__ level and sys.argv[0] is the way your executable was called (it means that it becomes affected by the working directory).

Andras answered 15/6, 2017 at 13:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.