如何在不拾取其他文件的情况下告诉Octave在何处查找功能?

时间:2015-03-06 22:15:08

标签: scripting path octave

我写了一个八度脚本脚本hello.m,它调用subfunc.m,它接受​​一个输入文件,一个命令行参数data.txt,它加载load(argv(){1}) 1}}。

如果我将所有三个文件放在同一目录中,并将其称为

./hello.m data.txt

然后一切都很好。

但如果我在另一个目录中有另一个data.txt,我想在其上运行我的脚本,并且我打电话

../helloscript/hello.m data.txt

此操作失败,因为hello.m无法找到subfunc.m

如果我打电话

octave --path "../helloscript" ../helloscript/hello.m data.txt
那时似乎工作正常。

问题在于,如果目录中没有data.txt,那么该脚本将会选择位于data.txt内的任何../helloscript

这似乎有点脆弱。有没有办法告诉octave,最好是在脚本本身,从脚本的同一目录中获取子函数,但是获取与当前目录相关的所有其他内容。

目前我能想到的最好的解决方案是内联脚本中的子功能,这有点令人讨厌。

有没有一种好的方法可以做到这一点,还是只是一个棘手的问题会导致偶尔难以发现并且无法避免?

这实际上只是我以前从未注意过的脚本语言的一般问题吗?怎么做,例如python处理它?<​​/ p>

似乎应该存在某种类型的库加载路径,可以在不改变数据加载路径的情况下进行设置。

1 个答案:

答案 0 :(得分:1)

将所有子功能添加到程序文件中并不令人讨厌。你为什么这么想?在脚本中使用函数定义是完全正常的。我所知道的唯一不能做到这一点的语言是Matlab,但这只是脑死亡。

另一种方法是检查输入文件参数data.txt是否存在。像这样:

fpath = argv (){1};
[info, err, msg] = stat (fpath);
if (err)
    error ("could not stat `%s' : %s", fpath, msg);
endif
## continue your script knowing the file exists 

但实际上,我建议你同时使用它们。在主程序中添加子函数,将它放在单独文件中的唯一原因是,如果您计划与其他程序共享,并始终检查输入参数。