609

考虑以下 Python 代码:

import os
print os.getcwd()

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

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

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

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

4

12 回答 12

958

您需要调用os.path.realpathon __file__,以便何时__file__是没有路径的文件名,您仍然可以获得 dir 路径:

import os
print(os.path.dirname(os.path.realpath(__file__)))
于 2012-02-19T16:10:35.347 回答
190

试试sys.path[0]

引用 Python 文档:

在程序启动时初始化时,此列表的第一项,path[0],是包含用于调用 Python 解释器的脚本的目录。如果脚本目录不可用(例如,如果交互调用解释器或从标准输入读取脚本),path[0]则为空字符串,它指示 Python 首先搜索当前目录中的模块。请注意,脚本目录是在插入的条目之前插入的PYTHONPATH

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

于 2011-03-29T15:43:38.483 回答
151

我用:

import os
import sys

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

正如 aiham 在评论中指出的那样,您可以在模块中定义此函数并在不同的脚本中使用它。

于 2011-02-09T10:18:07.130 回答
21

这段代码:

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

将“dn”设置为包含当前执行脚本的目录的名称。这段代码:

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

将“fn”设置为“script_dir/vcb.init”(以独立于平台的方式)并打开该文件以供当前执行的脚本读取。

请注意,“当前执行的脚本”有些模棱两可。如果您的整个程序由 1 个脚本组成,那么这就是当前正在执行的脚本,并且“sys.path[0]”解决方案可以正常工作。但是,如果您的应用程序包含脚本 A,它导入一些包“P”,然后调用脚本“B”,那么“PB”当前正在执行。如果您需要获取包含“PB”的目录,您需要“ os.path.realpath(__file__)”解决方案。

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

于 2012-05-27T01:59:25.423 回答
14
import os,sys
# Store current working directory
pwd = os.path.dirname(__file__)
# Append current directory to the python path
sys.path.append(pwd)
于 2011-02-09T07:01:26.460 回答
9
import os
script_dir = os.path.dirname(os.path.realpath(__file__)) + os.sep
于 2012-02-02T22:42:03.133 回答
7

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

os.path.realpath(__file__)
于 2011-09-20T15:38:28.967 回答
7

利用os.path.abspath('')

于 2011-02-08T16:06:46.193 回答
4

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

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)
于 2014-08-13T17:57:50.257 回答
3

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

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

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

于 2012-08-04T21:11:50.977 回答
0

尝试这个:

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)
于 2014-09-20T13:44:35.957 回答
0
import os
exec_filepath = os.path.realpath(__file__)
exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]
于 2011-11-22T16:47:42.467 回答