What is the Python equivalent of Perl's FindBin?
在Perl中,FindBin模块用于定位原始脚本的目录。在python中获取这个目录的规范方法是什么?
我看到的一些选择:
- os.path.dirname(os.path.realpath(sys.argv[0]))
- os.path.abspath(os.path.dirname(sys.argv[0]))
- os.path.abspath(os.path.dirname(__file__))
- 不要使用findbin:perlmunks.org/?NoDyIID=41213
- 珀尔蒙克斯的抱怨是过时的。创建findbin是因为,在/proc/pid/exe出现之前,需要启发式方法来查找当前可执行文件的路径。抱怨者有一个启发式的,这经常但并不总是奏效。最后,据报道芬德宾的启发式方法得到了改进。现在,它使用/proc/pid/exe(如果可用),在这样的系统上,它比Perlmonks讨论中的抱怨更可靠。
- 让我再加上我3岁以上关于findbin仍然有用的评论-非常有用,以至于perl findbin现在在核心perl分布中:imho比findbin更有用的是cpan的dir::self,它创建一个伪常量dir,扩展到源文件所在的目录(绝对)。findbin仅适用于可执行文件;dir适用于任何模块。
- dir适用于任何Perl文件,而不仅仅是模块或包。(Python)。导入…似乎只适用于软件包。)
- 哦,对不起,那是udir uuu。即下划线下划线。
您可以尝试以下操作:
1 2
| import os
bindir = os.path.abspath(os.path.dirname(__file__)) |
这将为您提供当前文件目录的绝对路径。
我不经常使用python,所以我不知道是否有findbin这样的包,但是
1 2 3
| import os
import sys
bindir = os.path.abspath(os.path.dirname(sys.argv[0])) |
应该工作。
- 我认为使用FindBin而不是Perl中的$0来定位脚本,即使它是通过链接访问的。sys.argv[0]几乎与$0相同,不适用于链接。
- 对不起,我错了。两者都不适用于链接。
- perl-findbin和dir::self_udir的一个主要用途是相对于脚本或模块加载模块。就我所知,在"use lib_dir_uuu"或"use lib$findbin::realbin"中,python的公认答案不能这样使用。//可接受的python答案可用于相对生成可执行文件。
- @Krazyglew校长,不是原则。在任何情况下,你都不知道操作的目的,但很明显,这个答案满足了他的要求。
- @西纳努尔:原则不是原则-脸红,你抓住我了。
- @西纳努尔:我不知道OP在寻找什么,但我知道我在寻找什么——一种相对于包含脚本的目录加载Python模块的方法,而不必破坏路径。由于这个问题似乎没有好的答案,我希望很快就会提出一个新问题。我也希望有人会说"重复的问题"。不正确,但你做到了。所以我想在这里记录下,以及在新的问题中,为什么这里被接受的答案不完全正确。
- @Sinanuur:除非您想在这里解释如何让python执行与perl等效的"使用findbin;使用lib"$findbin::realbin;"。或者"use dir::self;use lib_dir_u;"/,或者更好,如何相对地加载特定的模块或包,而不向库路径添加任何内容。(因为在添加文件时,向路径中添加任何内容都会在将来使您暴露在可能的冲突中。)
要更新之前的答案,使用python 3.4+,现在可以执行以下操作:
1 2
| import pathlib
bindir = pathlib.Path(__file__).resolve().parent |
这也会给你同样的效果,只是你会得到一个路径对象,它更适合你的工作。