考虑下面的Python代码:

import os
print os.getcwd()

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

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

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

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


当前回答

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

其他回答

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

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

我使用:

import os
import sys

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

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

尝试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

试试这个:

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)

这段代码:

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. exe”脚本。路径[0]“解决方案工作正常。但如果你的应用程序由脚本A组成,它导入某个包“P”,然后调用脚本“B”,那么“P.B”当前正在执行。如果你需要获取包含“P.B”的目录,你需要“os.path.realpath(__file__)”解决方案。

"__file__"只是给出了当前正在执行的(堆栈顶部)脚本的名称:"x.py"。它不 给出任何路径信息。它是“os.path”。调用Realpath来完成实际工作。