如何在Python中获取当前执行文件的路径?

发布于 2021-02-02 23:14:49

似乎是一个新手问题,但事实并非如此。一些通用方法并非在所有情况下都有效:

sys.argv [0]

这意味着使用path = os.path.abspath(os.path.dirname(sys.argv[0])),但是如果你是从另一个目录中的另一个Python脚本运行的,则此方法不起作用,并且这可能在现实生活中发生。

文件

这意味着使用path = os.path.abspath(os.path.dirname(__file__)),但是我发现这不起作用:

  • py2exe没有__file__属性,但是有一种解决方法
  • 当你从IDLE运行时,execute()没有__file__属性
  • 我得到的OS X 10.6 NameError: global name '__file__' is not defined
  • 答案不完整的相关问题:

  • Python-查找正在运行的文件的路径

  • 当前文件的路径取决于我如何执行程序
  • 如何知道Python中正在运行的脚本的路径?
  • 将目录更改为Python脚本的目录

我正在寻找一种通用解决方案,该解决方案可以在所有上述用例中使用。

更新资料

这是一个测试用例的结果:

python a.py的输出(在Windows上)
a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz

b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz

py

#! /usr/bin/env python
import os, sys

print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print

execfile("subdir/b.py")

subdir / b.py

#! /usr/bin/env python
import os, sys

print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()

print

C:.
|   a.py
\---subdir
        b.py
关注者
0
被浏览
74
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你无法直接确定正在执行的主脚本的位置。毕竟,有时脚本根本不是来自文件。例如,它可能来自交互式解释器或仅存储在内存中的动态生成的代码。

    但是,由于总是从文件加载模块,因此你可以可靠地确定模块的位置。如果使用以下代码创建模块并将其与主脚本放置在同一目录中,则主脚本可以导入模块并使用该模块定位自身。

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

    如果你在不同目录中有多个主脚本,则可能需要一个以上的module_locator副本。

    当然,如果你的主脚本是由其他一些工具加载的,而这些工具却不允许你导入与脚本位于同一位置的模块,那么你很不走运。在这种情况下,你所需要的信息根本就不在程序中任何地方。最好的选择是向工具作者提交错误。



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    首先,你需要从inspect和导入os

    from inspect import getsourcefile
    from os.path import abspath
    

    接下来,无论你要在哪里使用它来查找源文件

    abspath(getsourcefile(lambda:0))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看