如何使用python查找脚本的目录?

How can I find script's directory with Python?

本问题已经有最佳答案,请猛点这里访问。

考虑下面的python代码:

1
2
import os
print os.getcwd()

我使用os.getcwd()获取脚本文件的目录位置。当我从命令行运行脚本时,它给出了正确的路径,而当我从Django视图中的代码运行脚本时,它会打印/

如何从Django视图运行的脚本中获取脚本的路径?

更新:总结到目前为止的答案——os.getcwd()os.path.abspath()都给出了当前的工作目录,这个目录可能是脚本所在的目录,也可能不是。在我的web主机设置中,__file__只给出没有路径的文件名。

难道在Python中没有任何方法(总是)能够接收脚本所在的路径吗?


您需要在__file__上调用os.path.realpath,这样当__file__是一个没有路径的文件名时,您仍然可以得到dir路径:

1
2
import os
print(os.path.dirname(os.path.realpath(__file__)))


试试sys.path[0]

引用python文档:

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

来源:https://docs.python.org/library/sys.html sys.path


我使用:

1
2
3
4
5
import os
import sys

def get_script_path():
    return os.path.dirname(os.path.realpath(sys.argv[0]))

正如Aiham在注释中指出的,您可以在模块中定义这个函数,并在不同的脚本中使用它。


此代码:

1
2
import os
dn = os.path.dirname(os.path.realpath(__file__))

将"dn"设置为包含当前执行脚本的目录名。此代码:

1
2
fn = os.path.join(dn,"vcb.init")
fp = open(fn,"r")

将"fn"设置为"script_dir/vcb.init"(以独立于平台的方式),然后打开当前正在执行的脚本要读取的文件。

注意,"当前正在执行的脚本"有点含糊不清。如果整个程序由1个脚本组成,那么这就是当前正在执行的脚本,"sys.path[0]"解决方案可以正常工作。但是如果你的应用程序由脚本A组成,它导入一些包"p",然后调用脚本"b",那么"p.b"当前正在执行。如果需要获取包含"p.b"的目录,则需要"os.path.realpath(__file__)解决方案。

"__file__只是给出了当前正在执行(堆栈顶部)脚本的名称:"x.py"。它不提供任何路径信息。真正有用的是"os.path.real path"调用。


1
2
3
4
5
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)


1
2
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep


这对我很有用(我通过这个stackoverflow问题找到了它)

1
os.path.realpath(__file__)

这就是我的结局。如果我在解释器中导入脚本,并且将其作为脚本执行,这对我很有用:

1
2
3
4
5
6
7
8
9
10
import os
import sys

# Returns the directory the current script (or interpreter) is running in
def get_script_directory():
    path = os.path.realpath(sys.argv[0])
    if os.path.isdir(path):
        return path
    else:
        return os.path.dirname(path)

这是一个非常老的线程,但是当我试图将文件保存到脚本从cron作业运行python脚本时所在的当前目录中时,我遇到了这个问题。getcwd()和许多其他路径都会找到您的主目录。

获取我使用的脚本的绝对路径

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


使用os.path.abspath('')


试试这个:

1
2
3
def get_script_path(for_file = None):
    path = os.path.dirname(os.path.realpath(sys.argv[0] or 'something'))
    return path if not for_file else os.path.join(path, for_file)


1
2
3
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]