如何获取正在运行的 Python 脚本的路径? [复制]

Posted

技术标签:

【中文标题】如何获取正在运行的 Python 脚本的路径? [复制]【英文标题】:How do I get the path of the Python script I am running in? [duplicate] 【发布时间】:2010-10-10 08:47:43 【问题描述】:

重复:In Python, how do I get the path and name of the file that is currently executing?

如何获取我正在运行的 Python 脚本的路径?我在做dirname(sys.argv[0]),但是在 Mac 上我只得到文件名 - 而不是我在 Windows 上做的完整路径。

无论我的应用程序是从哪里启动的,我都想打开与我的脚本文件相关的文件。

【问题讨论】:

杰夫好像忘记了不是所有的python脚本都是模块,请提名重开。 @sorin 哦,但他们是;可以为任何脚本文件创建 module 对象。仅仅因为某些东西从未真正得到imported 并不能使它“不是一个模块”。无论如何,答案是相同的:将脚本视为一个模块(如果确实需要,请使用某种引导程序),然后应用相同的技术。 是的,脚本是一个模块,但是这个问得好问题应该重新打开。这里没有回答,“重复”问题不是重复的,因为它只回答了如何获取您已加载的模块的位置,而不是您所在的模块。 在***.com/questions/50499/…查看“导入检查”解决方案 @acidzombie24 你不需要完整路径来打开和操作目录中的文件。例如,您可以使用open('images/pets/dog.png'),而 Python 将执行其他操作。 【参考方案1】:
import os
print os.path.abspath(__file__)

【讨论】:

谢谢。这将获得编写代码的 .py 文件的路径,这就是我想要的,即使 OP 想要另一个路径。 这应该与其他答案中的信息相结合:os.path.abspath(os.path.dirname(__file__)) 将给出目录。【参考方案2】:

潜入 Python 的 7.2:Finding the Path。

import sys, os

print('sys.argv[0] =', sys.argv[0])             
pathname = os.path.dirname(sys.argv[0])        
print('path =', pathname)
print('full path =', os.path.abspath(pathname)) 

【讨论】:

我喜欢你的回答如何显示 python 的许多不同变体和功能来解决问题。 如果您通过另一个目录中的另一个脚本调用该脚本,则此不起作用 这可能是我们应该告诉作者的。 @SorinSbarnea 查看问题的主题:获取 running 脚本(已执行的脚本)的路径。 imported 模块只是一种资源。 这个问题不是很清楚,但你的解决方案只有在脚本开头调用它才有效(以确保没有人更改当前目录)。我倾向于改用检查方法。 “运行脚本”不一定与“调用脚本”(入口点)或“当前运行脚本”相同。【参考方案3】:

如果你甚至有相对路径名(在这种情况下它似乎是./),你可以打开相对于你的脚本文件的文件。我使用 Perl,但可以应用相同的通用解决方案:我将目录拆分为一组文件夹,然后将 pop 关闭最后一个元素(脚本),然后将 push(或者对你来说,append)放在任何位置我想要,然后再次加入他们,然后 BAM!我有一个工作路径名,它准确地指向我期望它指向的位置,相对或绝对。

当然,如发布的那样,还有更好的解决方案。我只是有点喜欢我的。

【讨论】:

在 python 中,如果您从完全不同的路径调用脚本,则这不起作用,例如如果你在~ 并且你的脚本在/some-path/script 你会得到./ 等于~ 而不是/some-path 他问的(我也需要) 问题是如何获取模块的路径,而不是如何从另一个构建一个路径名【参考方案4】:

使用它来获取当前文件的路径。它将解析路径中的任何符号链接。

import os

file_path = os.path.realpath(__file__)

这在我的 Mac 上运行良好。它在 Python 解释器中不起作用(您需要执行 Python 文件)。

【讨论】:

不太确定,这里是 OSX 10.6 NameError: global name '__file__' is not defined的结果 Sorin:也许你试过shell中的表达式? 在调用realpath 之前创建一个chdir 并且真实路径将失败,这不是答案。 NameError: global name '__file__' is not defined 错误只是表示您忘记了import os NameError: __file__ ... 我已经导入了os。不知道为什么这是公认的答案..?【参考方案5】:

如果您打算使用 py2exe 编译脚本,则可接受的解决方案将不起作用。如果您打算这样做,这是等效的功能:

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

Py2exe 不提供__file__ 变量。供参考:http://www.py2exe.org/index.cgi/Py2exeEnvironment

【讨论】:

不幸的是,正如 OP 所说,这在 Mac 上不起作用。请参阅sys.argv:这是否是完整路径名取决于操作系统 (获得真正的跨浏览器解决方案非常复杂......) @Stefano 这不是问题。要确保它是绝对(完整)路径名,请使用 os.path.abspath(...) 当我使用 jupyter notebook 时,这并没有给出感兴趣的 .py 文件的位置

以上是关于如何获取正在运行的 Python 脚本的路径? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在视图中获取 virtualenv 或 python 路径

python打包后获取exe路径

如何获取 python 模块的路径(不是 sys.executable)

通过批处理文件运行 abaqus python 脚本?

Python - 将文件拖入 .exe 以运行脚本

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