如何在 python dm-script 中获取当前文件路径

我想获取当前文件在数码显微图像中的文件路径python。我该怎么做呢?


我试着用


__file__

但我明白了NameError: Name not found globally.


我尝试将 与以下代码一起使用dm-script GetCurrentScriptSourceFilePath()来获取 python 的值


import DigitalMicrograph as DM

import time

    

# get the __file__ by executing dm-scripts GetCurrentScriptSourceFilePath()

# function, then save the value in the persistent tags and delete the key

# again

tag = "__python__file__{}".format(round(time.time() * 100))

DM.ExecuteScriptString(

    "String __file__;\n" + 

    "GetCurrentScriptSourceFilePath(__file__);\n" + 

    "number i = GetPersistentTagGroup().TagGroupCreateNewLabeledTag(\"" + tag + "\");\n" + 

    "GetPersistentTagGroup().TagGroupSetIndexedTagAsString(i, __file__);\n"

);

_, __file__ = DM.GetPersistentTagGroup().GetTagAsString(tag);

DM.ExecuteScriptString("GetPersistentTagGroup().TagGroupDeleteTagWithLabel(\"" + tag + "\");")

但似乎该GetCurrentScriptSourceFilePath()函数不包含路径(这是有道理的,因为它是从字符串执行的)。


我发现这篇文章推荐


import inspect

src_file_path = inspect.getfile(lambda: None)

但这显然src_file_path是"<string>"错误的。


我试图引发异常,然后使用以下代码获取它的文件名


try:

    raise Exception("No error")

except Exception as e:

    exc_type, exc_obj, exc_tb = sys.exc_info()

    filename = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]

    print("File: ", filename)

但我又一次得到<string>了filename。


我试图从脚本窗口中获取路径,但找不到任何函数来获取它。但是脚本窗口必须知道它的路径在哪里,否则Ctrl+S不能工作。


一些背景


我正在开发用于数码显微照片的模块。我也有测试文件。但是要在测试文件中导入(仍在开发的)模块,我需要相对于测试文件的路径。


稍后模块将安装在某个地方,所以这应该不是问题。但是为了提供一组完整的测试,我希望能够在不必安装(不工作的)模块的情况下执行测试。


POPMUISE
浏览 111回答 3
3回答

沧海一幻觉

对于当前工作目录的文件路径,请使用:import&nbsp;os os.getcwd()

四季花海

在您可以从 Python 脚本调用的 DM 脚本中,该命令GetApplicationDirectory()为您提供所需内容。通常,您会想要使用“open_save”,即GetApplicationDirectory("open_save",0)这将返回在使用文件/打开或在新图像上使用文件/保存时出现的目录(字符串变量)。但是,它不是用于“文件/保存工作区”或其他保存的内容。从有关该命令的 F1 帮助文档中:请注意,“当前”目录的概念在 Win10 上与应用程序(包括 GMS)有些冲突。特别是“SetApplicationDirectory”命令并不总是按预期工作......如果您想找出当前显示的特定文档的文件夹(图像或文本),您可以使用以下 DM 脚本。这里的假设是,窗口是最前面的窗口。documentwindow win = GetDocumentWindow(0)if ( win.WindowIsvalid() )&nbsp; &nbsp; if ( win.WindowIsLinkedToFile() )&nbsp; &nbsp; &nbsp; &nbsp; Result("\n" + win.WindowGetCurrentFile())

墨色风雨

对于也需要这个(并且只想复制一些代码)的每个人,我根据@BmyGuests 的回答创建了以下代码。这会获取脚本窗口绑定到的文件并将其保存为持久标记。然后从 python 文件中读取此标记(并删除标记)。重要说明:这仅在您按下“执行脚本”按钮的 python 脚本窗口中有效,并且仅当此文件已保存时!但是从那里开始,您可能正在导入应该提供该module.__file__属性的脚本。这意味着这不适用于插件/库。import DigitalMicrograph as DM# the name of the tag is used, this is deleted so it shouldn't matter anywayfile_tag_name = "__python__file__"# the dm-script to execute, double curly brackets are used because of the&nbsp;# python format functionscript = ("\n".join((&nbsp; &nbsp; "DocumentWindow win = GetDocumentWindow(0);",&nbsp; &nbsp; "if(win.WindowIsvalid()){{",&nbsp; &nbsp; &nbsp; &nbsp; "if(win.WindowIsLinkedToFile()){{",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "TagGroup tg = GetPersistentTagGroup();",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "if(!tg.TagGroupDoesTagExist(\"{tag_name}\")){{",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "number index = tg.TagGroupCreateNewLabeledTag(\"{tag_name}\");",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "tg.TagGroupSetIndexedTagAsString(index, win.WindowGetCurrentFile());",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "}}",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "else{{",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "tg.TagGroupSetTagAsString(\"{tag_name}\", win.WindowGetCurrentFile());",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "}}",&nbsp; &nbsp; &nbsp; &nbsp; "}}",&nbsp; &nbsp; "}}"))).format(tag_name=file_tag_name)# execute the dm scriptDM.ExecuteScriptString(script)# read from the global tags to get the value to the python scriptglobal_tags = DM.GetPersistentTagGroup()if global_tags.IsValid():&nbsp; &nbsp; s, __file__ = global_tags.GetTagAsString(file_tag_name);&nbsp; &nbsp; if s:&nbsp; &nbsp; &nbsp; &nbsp; # delete the created tag again&nbsp; &nbsp; &nbsp; &nbsp; DM.ExecuteScriptString(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "GetPersistentTagGroup()." +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "TagGroupDeleteTagWithLabel(\"{}\");".format(file_tag_name)&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; del __file__try:&nbsp; &nbsp; __file__except NameError:&nbsp; &nbsp; # set a default if the __file__ could not be received&nbsp; &nbsp; __file__ = ""&nbsp; &nbsp;&nbsp;print(__file__);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python