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

时间:2011-02-08 15:14:48

标签: python directory django-views getcwd

考虑以下Python代码:

import os
print os.getcwd()

我使用os.getcwd()get the script file's directory location。当我从命令行运行脚本时,它为我提供了正确的路径,而当我从Django视图中的代码运行的脚本运行它时,它会打印/

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

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

Python中没有任何方法可以(始终)能够接收脚本所在的路径吗?

12 个答案:

答案 0 :(得分:651)

您需要在os.path.realpath上致电__file__,这样当__file__是没有路径的文件名时,您仍会获得目录路径:

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

答案 1 :(得分:146)

尝试sys.path[0]

引用Python文档:

  

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

的结果插入条目之前插入了脚本目录

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

答案 2 :(得分:124)

我用:

import os
import sys

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

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

答案 3 :(得分:17)

此代码:

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”,那么“P.B”当前正在执行。如果您需要获取包含“P.B”的目录,则需要“os.path.realpath(__file__)”解决方案。

__file__”只提供当前正在执行的(堆栈顶部)脚本的名称:“x.py”。它没有 给出任何路径信息。这是执行实际工作的“os.path.realpath”调用。

答案 4 :(得分:15)

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

答案 5 :(得分:7)

这对我有用(我通过this stackoverflow question发现了它)

os.path.realpath(__file__)

答案 6 :(得分:7)

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

答案 7 :(得分:3)

使用os.path.abspath('')

答案 8 :(得分:3)

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

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

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

答案 9 :(得分:3)

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

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)

答案 10 :(得分: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)

答案 11 :(得分:-1)

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