我如何findPython的脚本目录?

考虑下面的Python代码:

import os print os.getcwd() 

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

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

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

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

您需要在__file__上调用os.path.realpath ,这样当__file__是没有path的文件名时,您仍然可以获得dirpath:

 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文档:

在程序启动时初始化,这个列表中的第一个项目path[0]是包含用于调用Python解释器的脚本的目录。 如果脚本目录不可用(例如,如果解释器是交互式调用的,或者脚本是从标准input读取的),则path[0]是空string,它指示Python首先search当前目录中的模块。 请注意,由于PYTHONPATH而插入的条目之前插入了脚本目录。

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

此代码:

 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]”解决scheme正常工作。 但是,如果您的应用程序由脚本A组成,而脚本A导入某个软件包“P”,然后调用脚本“B”,则“PB”正在执行。 如果您需要获取包含“PB”的目录,则需要“ os.path.realpath(__file__) ”解决scheme。

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

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

这工作对我来说(我发现它通过这个stackoverflow的问题 )

 os.path.realpath(__file__) 

使用os.path.abspath('')

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

 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()和很多其他的path出现在你的主目录。

获得我使用的脚本的绝对path

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

尝试这个:

 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 exec_filepath = os.path.realpath(__file__) exec_dirpath = exec_filepath[0:len(exec_filepath)-len(os.path.basename(__file__))]