如何在python中找到当前正在执行的脚本文件和路径?

时间:2013-06-22 10:28:15

标签: php python

我正在尝试获取当前正在执行的脚本的文件名和目录,这是有效的代码:

import inspect, os
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

在php中,这只是echo dirname(__FILE__)。好又简单。

有些建议认为dirname(__file__)应该在Python中有效,但在通过命令行运行时会返回一个空字符串。

我的问题是为什么我必须编写所有这些代码来获取文件名:

print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

我做错了吗?

3 个答案:

答案 0 :(得分:3)

当前脚本的__file__值与传递给Python的路径完全相同;因此python yourscript.py是相对路径,不包含目录名称。您确实需要将其设为绝对路径,但需要使用inspect

import os.path

print os.path.dirname(os.path.abspath(__file__))

演示:

$ cat /private/tmp/test.py 
import os.path

print os.path.dirname(os.path.abspath(__file__))

$ python /private/tmp/test.py 
/private/tmp
$ cd /private/tmp/
$ python test.py 
/private/tmp

在PHP中,您可以使用完全指定的绝对路径来执行文件的Web服务器,因此您从未看到过这个“问题”。

答案 1 :(得分:1)

  

我的问题是为什么我必须编写所有这些代码来获取文件名:

     

print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

让我们一点一点地把它拿走。

首先,print比PHP的echo长1个字符。我怀疑你有问题。

接下来,您必须使用os.path.dirname而不是dirname,因为Python允许将代码组织到模块中,并允许您通过限定名称引用事物。这就是为什么Python可以具有gzip.openio.open等具有相同名称的功能。但如果你不愿意,它不会强迫你使用合格的名字;如果您已完成,例如from os.path import dirname而不是import os,则可以使用dirname

接下来,您需要abspath因为您可能有相对路径。这实际上与PHP完全相同。只是你习惯于从一个始终以绝对路径运行脚本的Web浏览器设置运行PHP。如果需要,您可以在Python中执行相同的操作。

最后:

  

有些建议dirname(__file__)应该在python中工作,但是当通过命令行运行时它会返回一个空字符串。

不正确。

$ cat > test.py
print __file___
$ python test.py
test.py

如果通过“通过命令行运行”意味着“使用交互式解释器”,当然没有__file__,因为没有文件(终端标准输入除外)。

或者,如果你正在打印像dirname这样的相对路径的test.py,那当然总是一个空字符串,就像在PHP中一样。

全部放在一起:

$ cat > test.py
from os.path import dirname
print dirname(__file__)
$ python $(abspath test.py)
/Users/abarnert/src/test

就像PHP一样。

答案 2 :(得分:0)

如果未设置__file__,您可以通过

获取目录
import sys, os
script = os.path.abspath(sys.argv[0] or 'unknown script')
directory = os.path.dirname(script))