如何在Python中知道正在运行的脚本路径?

4

我的script.py使用相对路径创建了一个临时文件。

当以以下方式运行它:

python script.py

它按预期工作。

但是当您像这样运行时,它不起作用:

python /path/to/script.py

问题在于我不知道它将在哪个路径下运行。如何获取脚本文件夹的绝对路径("/path/to")以便可以在与脚本相同的目录中创建临时文件?

以下方法可行吗?

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

这个回答解决了您的问题吗?如何正确确定当前脚本目录? - outis
3个回答

12

根据经典著作《Dive Into Python》:

import sys, os

print 'sys.argv[0] =', sys.argv[0]             1
pathname = os.path.dirname(sys.argv[0])        2
print 'path =', pathname
print 'full path =', os.path.abspath(pathname)

1
os.path.abspath(os.path.dirname(file)) 是什么? - Juanjo Conti
根据另一个很好的答案,该答案详细解释了为什么__file__不是您要查找的内容:__file__是当前正在执行的文件(脚本或模块)的路径。如果从脚本中访问它,则这恰好与脚本相同,但这只是偶然的。 - gregoltsov
@gregoltsov 当你使用pyinstaller编译成.exe文件时,__file__无法正常工作。 - tiberhockey

9
两个当前的答案反映了你问题的模糊性。
当你运行python /path/to/script.py时,你想要你的临时文件在哪里?是在当前目录(./tempfile.txt)还是在/path/to/tempfile.txt?
如果是前者,你可以简单地使用相对路径(或者为奇怪和深奥的目的,像@Desintegr建议的那样获取等效于当前目录的绝对路径),使用os.getcwd函数。
如果是后者,你可以像@Jonathan建议的那样学习脚本的确切调用方式,并使用os.path中的函数来操作该路径(当然,如果是前一种情况,则也可以将这些函数应用于os.getcwd返回的内容),或者使用os.path.dirname(__file__)等类似函数(后者在将脚本作为模块导入时也需要这样做,而不仅仅是在作为主脚本运行时)。

谢谢,我希望临时文件与script.py脚本在同一个目录中。 - Juanjo Conti
1
@Juanjo,如果你使用os.path.dirname(__file__),那么这可能是最好的选择,而你选择的答案则是次优的(因为它需要导入一个额外的sys模块,而使用__file__可以避免这个问题)。 - Alex Martelli

0

你可以使用 os.getcwd() 方法来获取当前工作目录。

返回表示当前工作目录的字符串。
可用性:Unix,Windows。

你可以使用 os.chdir(path) 方法来更改当前工作目录。

将当前工作目录更改为 path。
可用性:Unix,Windows。


1
这个回答完全不同于被问的问题。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接