为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-06-06 15:06:29
我想获取当前文件在数码显微图像中的文件路径python。我该怎么做呢?我试着用__file__但我明白了NameError: Name not found globally.我尝试将 与以下代码一起使用dm-script GetCurrentScriptSourceFilePath()来获取 python 的值import DigitalMicrograph as DMimport time    # get the __file__ by executing dm-scripts GetCurrentScriptSourceFilePath()# function, then save the value in the persistent tags and delete the key# againtag = "__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 inspectsrc_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不能工作。一些背景我正在开发用于数码显微照片的模块。我也有测试文件。但是要在测试文件中导入(仍在开发的)模块,我需要相对于测试文件的路径。稍后模块将安装在某个地方,所以这应该不是问题。但是为了提供一组完整的测试,我希望能够在不必安装(不工作的)模块的情况下执行测试。
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

对于当前工作目录的文件路径,请使用:

import os
os.getcwd()


查看完整回答
反对 回复 2023-06-06
?
四季花海

TA贡献1811条经验 获得超5个赞

在您可以从 Python 脚本调用的 DM 脚本中,该命令GetApplicationDirectory()为您提供所需内容。通常,您会想要使用“open_save”,即

GetApplicationDirectory("open_save",0)

这将返回在使用文件/打开或在新图像上使用文件/保存时出现的目录(字符串变量)。但是,它不是用于“文件/保存工作区”或其他保存的内容。

从有关该命令的 F1 帮助文档中:

//img1.sycdn.imooc.com//647edb2400013b2b16830972.jpg

请注意,“当前”目录的概念在 Win10 上与应用程序(包括 GMS)有些冲突。特别是“SetApplicationDirectory”命令并不总是按预期工作......


如果您想找出当前显示的特定文档的文件夹(图像或文本),您可以使用以下 DM 脚本。这里的假设是,窗口是最前面的窗口。


documentwindow win = GetDocumentWindow(0)

if ( win.WindowIsvalid() )

    if ( win.WindowIsLinkedToFile() )

        Result("\n" + win.WindowGetCurrentFile())


查看完整回答
反对 回复 2023-06-06
?
墨色风雨

TA贡献1853条经验 获得超6个赞

对于也需要这个(并且只想复制一些代码)的每个人,我根据@BmyGuests 的回答创建了以下代码。这会获取脚本窗口绑定到的文件并将其保存为持久标记。然后从 python 文件中读取此标记(并删除标记)。


重要说明:这仅在您按下“执行脚本”按钮的 python 脚本窗口中有效,并且仅当此文件已保存时!但是从那里开始,您可能正在导入应该提供该module.__file__属性的脚本。这意味着这不适用于插件/库。


import DigitalMicrograph as DM


# the name of the tag is used, this is deleted so it shouldn't matter anyway

file_tag_name = "__python__file__"

# the dm-script to execute, double curly brackets are used because of the 

# python format function

script = ("\n".join((

    "DocumentWindow win = GetDocumentWindow(0);",

    "if(win.WindowIsvalid()){{",

        "if(win.WindowIsLinkedToFile()){{",

            "TagGroup tg = GetPersistentTagGroup();",

            "if(!tg.TagGroupDoesTagExist(\"{tag_name}\")){{",

                "number index = tg.TagGroupCreateNewLabeledTag(\"{tag_name}\");",

                "tg.TagGroupSetIndexedTagAsString(index, win.WindowGetCurrentFile());",

            "}}",

            "else{{",

                "tg.TagGroupSetTagAsString(\"{tag_name}\", win.WindowGetCurrentFile());",

            "}}",

        "}}",

    "}}"

))).format(tag_name=file_tag_name)


# execute the dm script

DM.ExecuteScriptString(script)


# read from the global tags to get the value to the python script

global_tags = DM.GetPersistentTagGroup()

if global_tags.IsValid():

    s, __file__ = global_tags.GetTagAsString(file_tag_name);

    if s:

        # delete the created tag again

        DM.ExecuteScriptString(

            "GetPersistentTagGroup()." + 

            "TagGroupDeleteTagWithLabel(\"{}\");".format(file_tag_name)

        )

    else:

        del __file__


try:

    __file__

except NameError:

    # set a default if the __file__ could not be received

    __file__ = ""

    

print(__file__);


查看完整回答
反对 回复 2023-06-06
  • 3 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信