我正在尝试获取当前正在执行的脚本的文件名和目录,这是有效的代码:
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())))
我做错了吗?
答案 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.open
和io.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))