How do I get the path of a the Python script I am running in?
Duplicate:
In Python, how do I get the path and name of the file that is currently executing?
如何获取正在运行的python脚本的路径?我在做dirname(sys.argv[0]),但是在mac上我只得到文件名,而不是像在windows上那样得到完整的路径。
无论从何处启动应用程序,我都希望打开与脚本文件相关的文件。
- Jeff似乎忘记了并非所有的python脚本都是模块,请指定重新打开。
- @Sorin噢,但是它们是;可以为任何脚本文件创建module对象。仅仅因为某个东西从未真正得到过importEd,就不能使它成为"非模块"。不管怎样,答案是相同的:将脚本视为一个模块(如果确实需要,可以使用某种引导),然后应用相同的技术。
- 是的,一个脚本是一个模块,但是这个问题应该被重新打开。这里没有回答这个问题,"复制"问题也不是复制的,因为它只回答如何获取已加载模块的位置,而不是您所在模块的位置。
- 请参阅stackoverflow.com/questions/50499/…上的"导入检查"解决方案。
- @acidzombie24您不需要完整的路径来打开和操作目录中的文件。例如,您可以使用open('images/pets/dog.png')和python来完成另一个任务。
- 我这里有一个一行解决方案:stackoverflow.com/questions/263219/…
- 我已更改了重复链接,以便它们指向实际的重复问题-此问题不需要重新打开。
os.path.realpath(__file__)将提供当前文件的路径,解析路径中的任何符号链接。这在我的Mac上很好用。
- 不太确定,这里是osx 10.6 NameError: global name '__file__' is not defined的结果
- 索林:也许你在贝壳里试过这个表达?
- 我得到了相同的结果,并将其用于程序而不是shell中。文件"c:python27pydocscli_mate newchimpbot.py",在init self.current_dict=os.path.realpath(file)+'datadefault_dict.dat'名称错误:未定义全局名称'file'。
- 在调用realpath之前先创建一个chdir,实际路径将失败,这不是答案。
- @黑猩猩先生,它是__file__,不是file。改变它能解决问题吗?
- @JPMC26我认为下划线变成了粗体格式…那是三年前的事了。我都不记得我用这个做什么了:)
- NameError: global name '__file__' is not defined错误仅仅意味着你忘记了import os。
- 我注意到,如果你把os.chdir('somewhere/else/')放在手边,它不知何故不会得到正确的路径。如os.chdir('..'); print os.path.realpath(__file__)。
- 当i execfile("script.py")时,则在script.py__file__内没有定义,而是当i import script时。
- 可能值得补充的是,只有当我们真的在执行脚本时,这才有效,因此在运行计算单元时(例如在Spyder中)它不起作用。
- 埃多克斯1〔20〕…我还进口了os。不知道为什么这是公认的答案。
- 这在Shell中不起作用。
- 路径末尾包含文件名,它不仅仅是路径:-(
7.2潜入Python:寻找路径。
1 2 3 4 5 6
| 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我看到如果我们从另一个目录中的另一个脚本调用它,它将不起作用。那么解决办法是什么呢?
- @Sorinsbarnea看到问题的主题:获取正在运行的脚本(已执行的脚本)的路径。imported模块只是一个资源。
- 这个问题不太清楚,但只有在脚本开始时调用它(以确保没有人更改当前目录),您的解决方案才能工作。我倾向于使用检查方法。""正在运行的脚本"不一定与"已调用的脚本"(入口点)或"当前正在运行的脚本"相同。
- 如果脚本在您的路径中,这在Unix上也不起作用!
- @索林和亚历克斯,请告诉我们怎么不起作用。如果我们知道它的作用,那将帮助我们找到一个真正的解决方案。
- "os.chdir()"会影响它。因此,在脚本中调用"os.chdir()"之前,请将路径保存在变量中。
1 2
| import os
print os.path.abspath(__file__) |
- 谢谢。这得到了写代码的.py文件的路径,这就是我想要的,尽管op需要另一个路径。
如果您计划使用py2exe编译脚本,则此问题的公认解决方案将不起作用。如果您打算这样做,这是功能等效的:
1
| os.path.dirname(sys.argv[0]) |
py2exe不提供__file__变量。参考:http://www.py2exe.org/index.cgi/py2exeenvironment
- 不幸的是,这在Mac上不起作用,正如操作人员所说。请参阅sys.argv:这取决于操作系统是否为完整路径名
- (获得真正的跨浏览器解决方案非常复杂…)
- @斯特凡诺,这不是问题。为了确保它是绝对(完整)路径名,请使用os.path.abspath(...)。
- 当我使用Jupyter笔记本时,这并不能说明.py文件的位置。
如果您甚至具有相对路径名(在本例中,它似乎是./),则可以打开与脚本文件相关的文件。我使用Perl,但同样的通用解决方案也适用:我将目录拆分成一组文件夹,然后从最后一个元素(脚本)中删除pop,然后在我想要的任何元素上删除push(或者对于您,append),然后再将它们连接在一起,然后砰!我有一个工作路径名,它精确地指向我期望它指向的位置,相对或绝对。
当然,有更好的解决方案,如贴出的。我只是有点喜欢我的。
- 在python中,如果您从完全不同的路径调用脚本,例如,如果您在~中,而您的脚本在/some-path/script中,您将得到./等于~而不是他要求的/some-path(我也需要)。
- 问题是如何获取模块的路径,而不是如何从另一个路径名构建一个路径名。
- 现在看看你,克里斯!现在看看你!