How do I get the path of the current executed file in Python?

前端 未结 13 2341
天命终不由人
天命终不由人 2020-11-22 17:06

This may seem like a newbie question, but it is not. Some common approaches don\'t work in all cases:

sys.argv[0]

This means using path = os.path.abs

相关标签:
13条回答
  • 2020-11-22 17:33

    You can use Path from the pathlib module:

    from pathlib import Path
    
    # ...
    
    Path(__file__)
    

    You can use call to parent to go further in the path:

    Path(__file__).parent
    
    0 讨论(0)
  • 2020-11-22 17:37

    If the code is coming from a file, you can get its full name

    sys._getframe().f_code.co_filename
    

    You can also retrieve the function name as f_code.co_name

    0 讨论(0)
  • 2020-11-22 17:38

    You can't directly determine the location of the main script being executed. After all, sometimes the script didn't come from a file at all. For example, it could come from the interactive interpreter or dynamically generated code stored only in memory.

    However, you can reliably determine the location of a module, since modules are always loaded from a file. If you create a module with the following code and put it in the same directory as your main script, then the main script can import the module and use that to locate itself.

    some_path/module_locator.py:

    def we_are_frozen():
        # All of the modules are built-in to the interpreter, e.g., by py2exe
        return hasattr(sys, "frozen")
    
    def module_path():
        encoding = sys.getfilesystemencoding()
        if we_are_frozen():
            return os.path.dirname(unicode(sys.executable, encoding))
        return os.path.dirname(unicode(__file__, encoding))
    

    some_path/main.py:

    import module_locator
    my_path = module_locator.module_path()
    

    If you have several main scripts in different directories, you may need more than one copy of module_locator.

    Of course, if your main script is loaded by some other tool that doesn't let you import modules that are co-located with your script, then you're out of luck. In cases like that, the information you're after simply doesn't exist anywhere in your program. Your best bet would be to file a bug with the authors of the tool.

    0 讨论(0)
  • 2020-11-22 17:38

    I was running into a similar problem, and I think this might solve the problem:

    def module_path(local_function):
       ''' returns the module path without the use of __file__.  Requires a function defined
       locally in the module.
       from http://stackoverflow.com/questions/729583/getting-file-path-of-imported-module'''
       return os.path.abspath(inspect.getsourcefile(local_function))
    

    It works for regular scripts and in idle. All I can say is try it out for others!

    My typical usage:

    from toolbox import module_path
    def main():
       pass # Do stuff
    
    global __modpath__
    __modpath__ = module_path(main)
    

    Now I use __modpath__ instead of __file__.

    0 讨论(0)
  • 2020-11-22 17:38

    You have simply called:

    path = os.path.abspath(os.path.dirname(sys.argv[0]))
    

    instead of:

    path = os.path.dirname(os.path.abspath(sys.argv[0]))
    

    abspath() gives you the absolute path of sys.argv[0] (the filename your code is in) and dirname() returns the directory path without the filename.

    0 讨论(0)
  • 2020-11-22 17:42

    The short answer is that there is no guaranteed way to get the information you want, however there are heuristics that work almost always in practice. You might look at How do I find the location of the executable in C?. It discusses the problem from a C point of view, but the proposed solutions are easily transcribed into Python.

    0 讨论(0)
提交回复
热议问题