2

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

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

我做错了吗?

4

3 回答 3

4

当前脚本的__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 服务器的奢侈,因此您从未见过这个“问题”出现在那里。

于 2013-06-22T10:37:10.367 回答
1

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

打印 os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

让我们一块一块来。

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

接下来,您必须使用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 一样。

于 2013-06-22T10:38:36.883 回答
0

如果__file__未设置,您可以通过以下方式获取目录

import sys, os
script = os.path.abspath(sys.argv[0] or 'unknown script')
directory = os.path.dirname(script))
于 2013-06-22T10:30:12.077 回答