我写了一个八度脚本脚本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>
似乎应该存在某种类型的库加载路径,可以在不改变数据加载路径的情况下进行设置。
答案 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
但实际上,我建议你同时使用它们。在主程序中添加子函数,将它放在单独文件中的唯一原因是,如果您计划与其他程序共享,并始终检查输入参数。