代码之家  ›  专栏  ›  技术社区  ›  SubniC

使用Python获取当前脚本的名称

  •  299
  • SubniC  · 技术社区  · 14 年前

    我正在尝试获取当前运行的Python脚本的名称。

    foo.py 为了得到脚本名,我想这样做:

    print Scriptname
    
    12 回复  |  直到 5 年前
        1
  •  553
  •   Sven Marnach    7 年前

    使用 __file__ . 如果要省略目录部分(可能存在),可以使用 os.path.basename(__file__) .

        2
  •  123
  •   Chris Morgan    14 年前
    import sys
    print sys.argv[0]
    

    这将打印 foo.py python foo.py , dir/foo.py python dir/foo.py 等等,这是 python . (注意在py2exe之后 foo.exe

        3
  •  63
  •   Ambroz Bizjak    12 年前

    请注意 __file__ 将给出此代码所在的文件,该文件可以导入,并且与正在解释的主文件不同。为了得到主文件 __main__ 可使用模块:

    import __main__ as main
    print(main.__file__)
    

    __main__.__file__ 在Python 2.7中工作,但在3.2中不工作,所以请像上面那样使用import语法使其可移植。

        4
  •  57
  •   Yoel    5 年前

    为了完整起见,我认为有必要总结各种可能的结果,并为每种结果的具体行为提供参考:

    • __file__ official documentation :

      __文件__ 是加载模块的文件的路径名(如果模块是从文件加载的)。这个 某些类型的模块可能缺少属性,例如 C类 静态链接到解释器中的模块;对于从共享库动态加载的扩展模块,它是共享库文件的路径名。

      From Python3.4 issue 18416 , __文件__ 始终是绝对路径,除非当前执行的文件是直接执行的脚本(不是通过带有 -m 命令行选项)使用相对路径。

    • __main__.__file__ __main__ )只需访问上述 __文件__ main module ,例如从命令行调用的脚本。

    • sys.argv[0] sys )是从命令行调用的脚本名,可能是绝对路径,如 official documentation :

      argv[0] -c 解释器的命令行选项, 设置为字符串 '-c' 参数[0] 是空字符串。

      another answer to this question , 蟒蛇 py2exe PyInstaller 使用此方法时可能无法显示所需的结果(即。 系统参数[0] 将保存可执行文件的名称,而不是主文件的名称 可执行文件中的文件)。

    • 如果上述选项似乎都不起作用(可能是由于不规则的导入操作),则 inspect module inspect.getfile() inspect.currentframe() return None 在没有 蟒蛇


    提取实际文件名的进一步操作

    os.path.basename() 可以在上面的任何一个上调用,以便提取实际的文件名和 os.path.splitext()

    Python 3.4 向前,每 PEP 428 PurePath class pathlib module 也可以使用。明确地, pathlib.PurePath().name 提取实际文件名并 pathlib.PurePath().stem

        5
  •  40
  •   bummi Haisum Usman    9 年前

    以上的答案是好的。但我发现利用上述结果,这种方法更有效。
    这将导致实际的脚本文件名不是路径。

    import sys    
    import os    
    file_name =  os.path.basename(sys.argv[0])
    
        6
  •  14
  •   Emil Melnikov    6 年前

    Path(__file__).name 应该更地道些。也, Path(__file__).stem 为您提供脚本名而不使用 .py

        7
  •  9
  •   ceth    14 年前

    试试这个:

    print __file__
    
        8
  •  8
  •   xtonousou    5 年前

    假设文件名是 foo.py ,下面的片段

    import sys
    print sys.argv[0][:-3]
    

    import sys
    print sys.argv[0][::-1][3:][::-1]
    

    对于其他包含更多字符的扩展,例如文件名 foo.pypy

    import sys
    print sys.argv[0].split('.')[0]
    

    如果要从绝对路径提取

    import sys
    print sys.argv[0].split('/')[-1].split('.')[0]
    

    将输出 foo

        9
  •  7
  •   Charlie OConor    8 年前

    sys中的第一个参数将是当前文件名,因此这将起作用

       import sys
       print sys.argv[0] # will print the file name
    
        10
  •  7
  •   goi42 Gajendra D Ambi    6 年前

    如果要执行不寻常的导入(例如,它是一个选项文件),请尝试:

    import inspect
    print (inspect.getfile(inspect.currentframe()))
    

    注意,这将返回文件的绝对路径。

        11
  •  1
  •   Peter M.    5 年前

    因为OP要求输入当前脚本文件的名称,所以我更希望

    import os
    os.path.split(sys.argv[0])[1]
    
        12
  •  0
  •   E.Big    7 年前

    我的快速肮脏解决方案:

    __file__.split('/')[-1:][0]
    
        13
  •  0
  •   CeDeROM    6 年前

    os.path.abspath(__file__) 会给你一条绝对的道路( relpath()

    sys.argv[-1] 会给你一个相对的路径。