Python copy file from script directory to current directory [duplicate] - python
I have scripts calling other script files but I need to get the filepath of the file that is currently running within the process.
For example, let's say I have three files. Using execfile:
script_1.py calls script_2.py.
In turn, script_2.py calls script_3.py.
How can I get the file name and path of script_3.py, from code within script_3.py, without having to pass that information as arguments from script_2.py?
(Executing os.getcwd() returns the original starting script's filepath not the current file's.)
__file__
as others have said. You may also want to use os.path.realpath to eliminate symlinks:
import os
os.path.realpath(__file__)
p1.py:
execfile("p2.py")
p2.py:
import inspect, os
print (inspect.getfile(inspect.currentframe())) # script filename (usually with path)
print (os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) # script directory
Update 2018-11-28:
Here is a summary of experiments with Python 2 and 3. With
main.py - runs foo.py
foo.py - runs lib/bar.py
lib/bar.py - prints filepath expressions
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
For Python 2, it might be clearer to switch to packages so can use from lib import bar - just add empty __init__.py files to the two folders.
For Python 3, execfile doesn't exist - the nearest alternative is exec(open(<filename>).read()), though this affects the stack frames. It's simplest to just use import foo and import lib.bar - no __init__.py files needed.
See also Difference between import and execfile
Original Answer:
Here is an experiment based on the answers in this thread - with Python 2.7.10 on Windows.
The stack-based ones are the only ones that seem to give reliable results. The last two have the shortest syntax, i.e. -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
Here's to these being added to sys as functions! Credit to #Usagi and #pablog
Based on the following three files, and running main.py from its folder with python main.py (also tried execfiles with absolute paths and calling from a separate folder).
C:\filepaths\main.py: execfile('foo.py')
C:\filepaths\foo.py: execfile('lib/bar.py')
C:\filepaths\lib\bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
I think this is cleaner:
import inspect
print inspect.stack()[0][1]
and gets the same information as:
print inspect.getfile(inspect.currentframe())
Where [0] is the current frame in the stack (top of stack) and [1] is for the file name, increase to go backwards in the stack i.e.
print inspect.stack()[1][1]
would be the file name of the script that called the current frame. Also, using [-1] will get you to the bottom of the stack, the original calling script.
import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only
The suggestions marked as best are all true if your script consists of only one file.
If you want to find out the name of the executable (i.e. the root file passed to the python interpreter for the current program) from a file that may be imported as a module, you need to do this (let's assume this is in a file named foo.py):
import inspect
print inspect.stack()[-1][1]
Because the last thing ([-1]) on the stack is the first thing that went into it (stacks are LIFO/FILO data structures).
Then in file bar.py if you import foo it'll print bar.py, rather than foo.py, which would be the value of all of these:
__file__
inspect.getfile(inspect.currentframe())
inspect.stack()[0][1]
Since Python 3 is fairly mainstream, I wanted to include a pathlib answer, as I believe that it is probably now a better tool for accessing file and path information.
from pathlib import Path
current_file: Path = Path(__file__).resolve()
If you are seeking the directory of the current file, it is as easy as adding .parent to the Path() statement:
current_path: Path = Path(__file__).parent.resolve()
It's not entirely clear what you mean by "the filepath of the file that is currently running within the process".
sys.argv[0] usually contains the location of the script that was invoked by the Python interpreter.
Check the sys documentation for more details.
As #Tim and #Pat Notz have pointed out, the __file__ attribute provides access to
the file from which the module was
loaded, if it was loaded from a file
import os
print os.path.basename(__file__)
this will give us the filename only. i.e. if abspath of file is c:\abcd\abc.py then 2nd line will print abc.py
I have a script that must work under windows environment.
This code snipped is what I've finished with:
import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])
it's quite a hacky decision. But it requires no external libraries and it's the most important thing in my case.
Try this,
import os
os.path.dirname(os.path.realpath(__file__))
import os
os.path.dirname(os.path.abspath(__file__))
No need for inspect or any other library.
This worked for me when I had to import a script (from a different directory then the executed script), that used a configuration file residing in the same folder as the imported script.
The __file__ attribute works for both the file containing the main execution code as well as imported modules.
See https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__
import sys
print sys.path[0]
this would print the path of the currently executing script
I think it's just __file__ Sounds like you may also want to checkout the inspect module.
You can use inspect.stack()
import inspect,os
inspect.stack()[0] => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
import sys
print sys.argv[0]
print(__file__)
print(__import__("pathlib").Path(__file__).parent)
This should work:
import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
Here is what I use so I can throw my code anywhere without issue. __name__ is always defined, but __file__ is only defined when the code is run as a file (e.g. not in IDLE/iPython).
if '__file__' in globals():
self_name = globals()['__file__']
elif '__file__' in locals():
self_name = locals()['__file__']
else:
self_name = __name__
Alternatively, this can be written as:
self_name = globals().get('__file__', locals().get('__file__', __name__))
To get directory of executing script
print os.path.dirname( inspect.getfile(inspect.currentframe()))
I used the approach with __file__
os.path.abspath(__file__)
but there is a little trick, it returns the .py file
when the code is run the first time,
next runs give the name of *.pyc file
so I stayed with:
inspect.getfile(inspect.currentframe())
or
sys._getframe().f_code.co_filename
I wrote a function which take into account eclipse debugger and unittest.
It return the folder of the first script you launch. You can optionally specify the __file__ var, but the main thing is that you don't have to share this variable across all your calling hierarchy.
Maybe you can handle others stack particular cases I didn't see, but for me it's ok.
import inspect, os
def getRootDirectory(_file_=None):
"""
Get the directory of the root execution file
Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing
For eclipse user with unittest or debugger, the function search for the correct folder in the stack
You can pass __file__ (with 4 underscores) if you want the caller directory
"""
# If we don't have the __file__ :
if _file_ is None:
# We get the last :
rootFile = inspect.stack()[-1][1]
folder = os.path.abspath(rootFile)
# If we use unittest :
if ("/pysrc" in folder) & ("org.python.pydev" in folder):
previous = None
# We search from left to right the case.py :
for el in inspect.stack():
currentFile = os.path.abspath(el[1])
if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile):
break
previous = currentFile
folder = previous
# We return the folder :
return os.path.dirname(folder)
else:
# We return the folder according to specified __file__ :
return os.path.dirname(os.path.realpath(_file_))
Simplest way is:
in script_1.py:
import subprocess
subprocess.call(['python3',<path_to_script_2.py>])
in script_2.py:
sys.argv[0]
P.S.: I've tried execfile, but since it reads script_2.py as a string, sys.argv[0] returned <string>.
The following returns the path where your current main script is located at. I tested this with Linux, Win10, IPython and Jupyter Lab. I needed a solution that works for local Jupyter notebooks as well.
import builtins
import os
import sys
def current_dir():
if "get_ipython" in globals() or "get_ipython" in dir(builtins):
# os.getcwd() is PROBABLY the dir that hosts the active notebook script.
# See also https://github.com/ipython/ipython/issues/10123
return os.getcwd()
else:
return os.path.abspath(os.path.dirname(sys.argv[0]))
Finding the home directory of the path in which your Python script resides
As an addendum to the other answers already here (and not answering the OP's question, since other answers already do that), if the path to your script is /home/gabriel/GS/dev/eRCaGuy_dotfiles/useful_scripts/cpu_logger.py, and you wish to obtain the home directory part of that path, which is /home/gabriel, you can do this:
import os
# Obtain the home dir of the user in whose home directory this script resides
script_path_list = os.path.normpath(__file__).split(os.sep)
home_dir = os.path.join("/", script_path_list[1], script_path_list[2])
To help make sense of this, here are the paths for __file__, script_path_list, and home_dir. Notice that script_path_list is a list of the path components, with the first element being an empty string since it originally contained the / root dir path separator for this Linux path:
__file__ = /home/gabriel/GS/dev/eRCaGuy_dotfiles/useful_scripts/cpu_logger.py
script_path_list = ['', 'home', 'gabriel', 'GS', 'dev', 'eRCaGuy_dotfiles', 'useful_scripts', 'cpu_logger.py']
home_dir = /home/gabriel
Source:
Python: obtain the path to the home directory of the user in whose directory the script being run is located [duplicate]
Related
how to get script name when using execfile() in IPython to run script [duplicate]
I have scripts calling other script files but I need to get the filepath of the file that is currently running within the process. For example, let's say I have three files. Using execfile: script_1.py calls script_2.py. In turn, script_2.py calls script_3.py. How can I get the file name and path of script_3.py, from code within script_3.py, without having to pass that information as arguments from script_2.py? (Executing os.getcwd() returns the original starting script's filepath not the current file's.)
__file__ as others have said. You may also want to use os.path.realpath to eliminate symlinks: import os os.path.realpath(__file__)
p1.py: execfile("p2.py") p2.py: import inspect, os print (inspect.getfile(inspect.currentframe())) # script filename (usually with path) print (os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) # script directory
Update 2018-11-28: Here is a summary of experiments with Python 2 and 3. With main.py - runs foo.py foo.py - runs lib/bar.py lib/bar.py - prints filepath expressions | Python | Run statement | Filepath expression | |--------+---------------------+----------------------------------------| | 2 | execfile | os.path.abspath(inspect.stack()[0][1]) | | 2 | from lib import bar | __file__ | | 3 | exec | (wasn't able to obtain it) | | 3 | import lib.bar | __file__ | For Python 2, it might be clearer to switch to packages so can use from lib import bar - just add empty __init__.py files to the two folders. For Python 3, execfile doesn't exist - the nearest alternative is exec(open(<filename>).read()), though this affects the stack frames. It's simplest to just use import foo and import lib.bar - no __init__.py files needed. See also Difference between import and execfile Original Answer: Here is an experiment based on the answers in this thread - with Python 2.7.10 on Windows. The stack-based ones are the only ones that seem to give reliable results. The last two have the shortest syntax, i.e. - print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib Here's to these being added to sys as functions! Credit to #Usagi and #pablog Based on the following three files, and running main.py from its folder with python main.py (also tried execfiles with absolute paths and calling from a separate folder). C:\filepaths\main.py: execfile('foo.py') C:\filepaths\foo.py: execfile('lib/bar.py') C:\filepaths\lib\bar.py: import sys import os import inspect print "Python " + sys.version print print __file__ # main.py print sys.argv[0] # main.py print inspect.stack()[0][1] # lib/bar.py print sys.path[0] # C:\filepaths print print os.path.realpath(__file__) # C:\filepaths\main.py print os.path.abspath(__file__) # C:\filepaths\main.py print os.path.basename(__file__) # main.py print os.path.basename(os.path.realpath(sys.argv[0])) # main.py print print sys.path[0] # C:\filepaths print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths print os.path.dirname(__file__) # (empty string) print print inspect.getfile(inspect.currentframe()) # lib/bar.py print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib print print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib print
I think this is cleaner: import inspect print inspect.stack()[0][1] and gets the same information as: print inspect.getfile(inspect.currentframe()) Where [0] is the current frame in the stack (top of stack) and [1] is for the file name, increase to go backwards in the stack i.e. print inspect.stack()[1][1] would be the file name of the script that called the current frame. Also, using [-1] will get you to the bottom of the stack, the original calling script.
import os os.path.dirname(__file__) # relative directory path os.path.abspath(__file__) # absolute file path os.path.basename(__file__) # the file name only
The suggestions marked as best are all true if your script consists of only one file. If you want to find out the name of the executable (i.e. the root file passed to the python interpreter for the current program) from a file that may be imported as a module, you need to do this (let's assume this is in a file named foo.py): import inspect print inspect.stack()[-1][1] Because the last thing ([-1]) on the stack is the first thing that went into it (stacks are LIFO/FILO data structures). Then in file bar.py if you import foo it'll print bar.py, rather than foo.py, which would be the value of all of these: __file__ inspect.getfile(inspect.currentframe()) inspect.stack()[0][1]
Since Python 3 is fairly mainstream, I wanted to include a pathlib answer, as I believe that it is probably now a better tool for accessing file and path information. from pathlib import Path current_file: Path = Path(__file__).resolve() If you are seeking the directory of the current file, it is as easy as adding .parent to the Path() statement: current_path: Path = Path(__file__).parent.resolve()
It's not entirely clear what you mean by "the filepath of the file that is currently running within the process". sys.argv[0] usually contains the location of the script that was invoked by the Python interpreter. Check the sys documentation for more details. As #Tim and #Pat Notz have pointed out, the __file__ attribute provides access to the file from which the module was loaded, if it was loaded from a file
import os print os.path.basename(__file__) this will give us the filename only. i.e. if abspath of file is c:\abcd\abc.py then 2nd line will print abc.py
I have a script that must work under windows environment. This code snipped is what I've finished with: import os,sys PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0]) it's quite a hacky decision. But it requires no external libraries and it's the most important thing in my case.
Try this, import os os.path.dirname(os.path.realpath(__file__))
import os os.path.dirname(os.path.abspath(__file__)) No need for inspect or any other library. This worked for me when I had to import a script (from a different directory then the executed script), that used a configuration file residing in the same folder as the imported script.
The __file__ attribute works for both the file containing the main execution code as well as imported modules. See https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__
import sys print sys.path[0] this would print the path of the currently executing script
I think it's just __file__ Sounds like you may also want to checkout the inspect module.
You can use inspect.stack() import inspect,os inspect.stack()[0] => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0) os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
import sys print sys.argv[0]
print(__file__) print(__import__("pathlib").Path(__file__).parent)
This should work: import os,sys filename=os.path.basename(os.path.realpath(sys.argv[0])) dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
Here is what I use so I can throw my code anywhere without issue. __name__ is always defined, but __file__ is only defined when the code is run as a file (e.g. not in IDLE/iPython). if '__file__' in globals(): self_name = globals()['__file__'] elif '__file__' in locals(): self_name = locals()['__file__'] else: self_name = __name__ Alternatively, this can be written as: self_name = globals().get('__file__', locals().get('__file__', __name__))
To get directory of executing script print os.path.dirname( inspect.getfile(inspect.currentframe()))
I used the approach with __file__ os.path.abspath(__file__) but there is a little trick, it returns the .py file when the code is run the first time, next runs give the name of *.pyc file so I stayed with: inspect.getfile(inspect.currentframe()) or sys._getframe().f_code.co_filename
I wrote a function which take into account eclipse debugger and unittest. It return the folder of the first script you launch. You can optionally specify the __file__ var, but the main thing is that you don't have to share this variable across all your calling hierarchy. Maybe you can handle others stack particular cases I didn't see, but for me it's ok. import inspect, os def getRootDirectory(_file_=None): """ Get the directory of the root execution file Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing For eclipse user with unittest or debugger, the function search for the correct folder in the stack You can pass __file__ (with 4 underscores) if you want the caller directory """ # If we don't have the __file__ : if _file_ is None: # We get the last : rootFile = inspect.stack()[-1][1] folder = os.path.abspath(rootFile) # If we use unittest : if ("/pysrc" in folder) & ("org.python.pydev" in folder): previous = None # We search from left to right the case.py : for el in inspect.stack(): currentFile = os.path.abspath(el[1]) if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile): break previous = currentFile folder = previous # We return the folder : return os.path.dirname(folder) else: # We return the folder according to specified __file__ : return os.path.dirname(os.path.realpath(_file_))
Simplest way is: in script_1.py: import subprocess subprocess.call(['python3',<path_to_script_2.py>]) in script_2.py: sys.argv[0] P.S.: I've tried execfile, but since it reads script_2.py as a string, sys.argv[0] returned <string>.
The following returns the path where your current main script is located at. I tested this with Linux, Win10, IPython and Jupyter Lab. I needed a solution that works for local Jupyter notebooks as well. import builtins import os import sys def current_dir(): if "get_ipython" in globals() or "get_ipython" in dir(builtins): # os.getcwd() is PROBABLY the dir that hosts the active notebook script. # See also https://github.com/ipython/ipython/issues/10123 return os.getcwd() else: return os.path.abspath(os.path.dirname(sys.argv[0]))
Finding the home directory of the path in which your Python script resides As an addendum to the other answers already here (and not answering the OP's question, since other answers already do that), if the path to your script is /home/gabriel/GS/dev/eRCaGuy_dotfiles/useful_scripts/cpu_logger.py, and you wish to obtain the home directory part of that path, which is /home/gabriel, you can do this: import os # Obtain the home dir of the user in whose home directory this script resides script_path_list = os.path.normpath(__file__).split(os.sep) home_dir = os.path.join("/", script_path_list[1], script_path_list[2]) To help make sense of this, here are the paths for __file__, script_path_list, and home_dir. Notice that script_path_list is a list of the path components, with the first element being an empty string since it originally contained the / root dir path separator for this Linux path: __file__ = /home/gabriel/GS/dev/eRCaGuy_dotfiles/useful_scripts/cpu_logger.py script_path_list = ['', 'home', 'gabriel', 'GS', 'dev', 'eRCaGuy_dotfiles', 'useful_scripts', 'cpu_logger.py'] home_dir = /home/gabriel Source: Python: obtain the path to the home directory of the user in whose directory the script being run is located [duplicate]
DJANGO 1.9 | views.py | execute *.bat file | location for save file
I have 2 questions(I could not find answer on stackoverflow): First question: I added run_command.bat file to: DjangoProj/ ---DjangoApp/ ------views.py ------run_command.bat In method save_logs in DjangoProj/DjangoApp/views.py I tried: def save_logs(request): choosenMachines = request.GET.getlist('mvsMachine') (data,errors) = subprocess.Popen(r'run_command.bat' + str(choosenMachines), shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate() But I got this error: the run_command.bat is not recognize as external or internal command, exec file or batch file I suppose that Django is currently in another path(the question is which) And second question: Where is saved txt file created by method from DjangoProj/DjangoApp/views.py def set_parameters_on_ftp(request): with open('start_task.txt', 'w') as f: for command in commands: f.write(command+'\n') return It suppose it should be in: DjangoProj/DjangoApp/*
For the first question: import os #Set myPath variable to the path of the file being executed myPath = os.path.dirname(os.path.abspath(__file__)) #Change current working directory to myPath os.chdir(myPath) #Or change current working directory to a subdirectory of myPath os.chdir(os.path.join(myPath, 'subFolder')) For the second question: import os #Check the current working directory. The txt file is getting saved here. os.getcwd() #This can be changed by changing the working directory as described in the answer to the first question. EDIT: Changed the os.chdir() syntax error in the first part.
Your guess was true. Django current running path is not in your project folder. In my testing it was in C:\Python27 you must give exact path or use PROJECT_ROOT variable in settings file. Have fun
Python: How do i get the name of the current archive?
Is there any way to get the current archive name in Python? Something like EggArchive.egg Lib ---SomePythonFile.py From SomePython.py, is there anyway to fetch the .egg name?
The variable __file__ contains the path to the current python file. So If you have a structure: . `- your.egg `-your_module.py And in your_module.py you have a function: def func(): print(__file__) The the code: import sys sys.path.append('/path/to/your.egg') from your_module import func func() Will print out: /path/to/your.egg/your_module.py So basically you can manipulate the __file__ variable if you know where relatively your module is inside the egg file and get the full path to the egg. To get the relative path to the egg in the script that's in the egg file you'll have to do: def rel_to_egg(f): my_dir = os.path.dirname(os.path.abspath(f)) current = my_dir while not current.endswith('.egg'): current = os.path.dirname(current) return os.path.relpath(current, my_dir) Now let's say __file__ == '/test/my.egg/some/dir/my_script.py': >>> print(rel_to_egg(__file__)) '../..'
How to Get the Path of the executing frozen script
If you are running a frozen python script (frozen using py2exe) from a directory and drive different from where the script is present, what is the best way to determine the path of the executing script? Few solutions I have tried inspect.getfile(inspect.currentframe()) Problem: Does not return the full path. It only returns the script name. os.path.abspath( __file__ ) Problem: Doesn't work on Windows os.path.dirname(sys.argv[0]) Problem: Returns empty string. os.path.abspath(inspect.getsourcefile(way3)) Will not work if the drive is different from the pwd os.path.dirname(os.path.realpath(sys.argv[0])) Will not work if the drive is different from the pwd Here is a minimal not-working example D:\>path PATH=c:\Python27\;c:\Users\abhibhat\Desktop\ToBeRemoved\spam\dist\;c:\gnuwin32\bin D:\>cat c:\Users\abhibhat\Desktop\ToBeRemoved\spam\eggs.py import os, inspect, sys def way1(): return os.path.dirname(sys.argv[0]) def way2(): return inspect.getfile(inspect.currentframe()) def way3(): return os.path.dirname(os.path.realpath(sys.argv[0])) def way4(): try: return os.path.abspath( __file__ ) except NameError: return "Not Found" def way5(): return os.path.abspath(inspect.getsourcefile(way3)) if __name__ == '__main__': print "Path to this script is",way1() print "Path to this script is",way2() print "Path to this script is",way3() print "Path to this script is",way4() print "Path to this script is",way5() D:\>eggs Path to this script is Path to this script is eggs.py Path to this script is D:\ Path to this script is Not Found Related Questions: How to know the path of the running script in Python? How do I get the path and name of the file that is currently executing? python, path of script [closed] Note #Fenikso's solution will work if the script resides on the same drive where you are executing but when its on a different drive, it will not work
Another approach which works with cxFreeze when running from another drive even using PATH: import sys if hasattr(sys, 'frozen'): print(sys.executable) else: print(sys.argv[0]) From Python: H:\Python\Examples\cxfreeze\pwdme.py From command line: D:\>h:\Python\Examples\cxfreeze\dist\pwdme.exe h:\Python\Examples\cxfreeze\dist\pwdme.exe Using PATH: D:\>pwdme.exe h:\Python\Examples\cxfreeze\dist\pwdme.exe
IMHO, code that acts differently depending from absolute paths is not a good solution. It will be probably better a relative path solution. Use dirname to know the relative directory and os.sep for cross platform compatibility. if hasattr(sys, "frozen"): main_dir = os.path.dirname(sys.executable) full_real_path = os.path.realpath(sys.executable) else: script_dir = os.path.dirname(__file__) main_dir = os.path.dirname(os.path.realpath(sys.argv[0])) full_real_path = os.path.realpath(sys.argv[0]) the frozen attribute is python standard. Take a look also at Esky : http://pypi.python.org/pypi/esky
Try this: WD = os.path.dirname(os.path.realpath(sys.argv[0])) That is what I use with cx_Freeze to get the directory from where the .exe is really running.
How do I get the full path of the current file's directory?
How do I get the current file's directory path? I tried: >>> os.path.abspath(__file__) 'C:\\python27\\test.py' But I want: 'C:\\python27\\'
The special variable __file__ contains the path to the current file. From that we can get the directory using either pathlib or the os.path module. Python 3 For the directory of the script being run: import pathlib pathlib.Path(__file__).parent.resolve() For the current working directory: import pathlib pathlib.Path().resolve() Python 2 and 3 For the directory of the script being run: import os os.path.dirname(os.path.abspath(__file__)) If you mean the current working directory: import os os.path.abspath(os.getcwd()) Note that before and after file is two underscores, not just one. Also note that if you are running interactively or have loaded code from something other than a file (eg: a database or online resource), __file__ may not be set since there is no notion of "current file". The above answer assumes the most common scenario of running a python script that is in a file. References pathlib in the python documentation. os.path - Python 2.7, os.path - Python 3 os.getcwd - Python 2.7, os.getcwd - Python 3 what does the __file__ variable mean/do?
Using Path from pathlib is the recommended way since Python 3: from pathlib import Path print("File Path:", Path(__file__).absolute()) print("Directory Path:", Path().absolute()) # Directory of current working directory, not __file__ Note: If using Jupyter Notebook, __file__ doesn't return expected value, so Path().absolute() has to be used.
In Python 3.x I do: from pathlib import Path path = Path(__file__).parent.absolute() Explanation: Path(__file__) is the path to the current file. .parent gives you the directory the file is in. .absolute() gives you the full absolute path to it. Using pathlib is the modern way to work with paths. If you need it as a string later for some reason, just do str(path).
Try this: import os dir_path = os.path.dirname(os.path.realpath(__file__))
import os print(os.path.dirname(__file__))
I found the following commands return the full path of the parent directory of a Python 3 script. Python 3 Script: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from pathlib import Path #Get the absolute path of a Python3.6 and above script. dir1 = Path().resolve() #Make the path absolute, resolving any symlinks. dir2 = Path().absolute() #See #RonKalian answer dir3 = Path(__file__).parent.absolute() #See #Arminius answer dir4 = Path(__file__).parent print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}\ndir4={dir4}') REMARKS !!!! dir1 and dir2 works only when running a script located in the current working directory, but will break in any other case. Given that Path(__file__).is_absolute() is True, the use of the .absolute() method in dir3 appears redundant. The shortest command that works is dir4. Explanation links: .resolve(), .absolute(), Path(file).parent().absolute()
USEFUL PATH PROPERTIES IN PYTHON: from pathlib import Path #Returns the path of the current directory mypath = Path().absolute() print('Absolute path : {}'.format(mypath)) #if you want to go to any other file inside the subdirectories of the directory path got from above method filePath = mypath/'data'/'fuel_econ.csv' print('File path : {}'.format(filePath)) #To check if file present in that directory or Not isfileExist = filePath.exists() print('isfileExist : {}'.format(isfileExist)) #To check if the path is a directory or a File isadirectory = filePath.is_dir() print('isadirectory : {}'.format(isadirectory)) #To get the extension of the file fileExtension = mypath/'data'/'fuel_econ.csv' print('File extension : {}'.format(filePath.suffix)) OUTPUT: ABSOLUTE PATH IS THE PATH WHERE YOUR PYTHON FILE IS PLACED Absolute path : D:\Study\Machine Learning\Jupitor Notebook\JupytorNotebookTest2\Udacity_Scripts\Matplotlib and seaborn Part2 File path : D:\Study\Machine Learning\Jupitor Notebook\JupytorNotebookTest2\Udacity_Scripts\Matplotlib and seaborn Part2\data\fuel_econ.csv isfileExist : True isadirectory : False File extension : .csv
works also if __file__ is not available (jupyter notebooks) import sys from pathlib import Path path_file = Path(sys.path[0]) print(path_file) Also uses pathlib, which is the object oriented way of handling paths in python 3.
IPython has a magic command %pwd to get the present working directory. It can be used in following way: from IPython.terminal.embed import InteractiveShellEmbed ip_shell = InteractiveShellEmbed() present_working_directory = ip_shell.magic("%pwd") On IPython Jupyter Notebook %pwd can be used directly as following: present_working_directory = %pwd
I have made a function to use when running python under IIS in CGI in order to get the current folder: import os def getLocalFolder(): path=str(os.path.dirname(os.path.abspath(__file__))).split(os.sep) return path[len(path)-1]
Python 2 and 3 You can simply also do: from os import sep print(__file__.rsplit(sep, 1)[0] + sep) Which outputs something like: C:\my_folder\sub_folder\
This can be done without a module. def get_path(): return (__file__.replace(f"<your script name>.py", "")) print(get_path())