我如何findPython的脚本目录?
考虑下面的Python代码:
import os print os.getcwd()
我使用os.getcwd()
来获取脚本文件的目录位置 。 当我从命令行运行脚本时,它给了我正确的path,而当我从Django视图中的代码运行的脚本运行它时,它会打印/
。
如何从Django视图运行的脚本中获取脚本的path?
更新:
总结到目前为止的答案 – os.getcwd()
和os.path.abspath()
都给当前的工作目录,可能或不可能是脚本所在的目录。 在我的网站主机设置
只给出没有path的文件名。 __file__
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__))]