Kdb 相对于当前脚本而不是相对于工作目录加载q文件
我想加载一个与我当前所在的源文件相关的q脚本,无论q进程启动时我在哪里 例如,我有一个项目:Kdb 相对于当前脚本而不是相对于工作目录加载q文件,kdb,Kdb,我想加载一个与我当前所在的源文件相关的q脚本,无论q进程启动时我在哪里 例如,我有一个项目: - myproject/ a.q b.q 在a.q中,我有以下几行: ... system"l b.q"; ... 我的问题是,这只在我将cd刻录到myproject/时起作用,因此b.q位于当前工作目录中 我希望能够从a.q加载b.q,而不必使用绝对路径,无论从何处启动脚本 例如,在python中,我可以使用os.path.realpath来实现这一点。实现这一
- myproject/
a.q
b.q
在a.q中,我有以下几行:
...
system"l b.q";
...
我的问题是,这只在我将cd刻录到myproject/时起作用,因此b.q位于当前工作目录中
我希望能够从a.q加载b.q,而不必使用绝对路径,无论从何处启动脚本
例如,在python中,我可以使用os.path.realpath来实现这一点。实现这一点的一种方法是使用环境变量。您可以在bash中使用export命令启动q会话之前设置这些。这里有一个简单的例子:
$ export TABLE=/home/mclark/tab.q
$ q
q)getenv[`TABLE]
"/home/mclark/tab.q"
这样就保存了文件的绝对路径,您可以以类似的方式加载脚本
如果不想使用环境变量,可以开始使用.z.o和.z.f。下面是一个快速示例,其中我正在加载一个包含字典dict的文件:
.z.f将打印在启动q进程时传入的q脚本的名称,因此在上述示例中为`path/a.q。希望这样的函数能在这方面给您带来更多的灵活性。实现这一点的一种方法是使用环境变量。您可以在bash中使用export命令启动q会话之前设置这些。这里有一个简单的例子:
$ export TABLE=/home/mclark/tab.q
$ q
q)getenv[`TABLE]
"/home/mclark/tab.q"
这样就保存了文件的绝对路径,您可以以类似的方式加载脚本
如果不想使用环境变量,可以开始使用.z.o和.z.f。下面是一个快速示例,其中我正在加载一个包含字典dict的文件:
.z.f将打印在启动q进程时传入的q脚本的名称,因此在上述示例中为`path/a.q。希望这样的函数可以在这方面给您带来更多的灵活性。您可以使用Charlie Skelton在k4列表框中提出的这个小技巧来实现:
thisFile:hsym`$(reverse value {})2;
thisPath:first` vs thisFile;
otherFile:` sv thisPath,`other.q;
一些注意事项-只有当代码作为脚本的一部分运行时,它才起作用,也就是说,如果您在会话或IDE中手动运行这些行,它就不起作用。第二个警告是,如果您使用\ \来扰乱您的q脚本,那么它将不起作用。第三个警告是,值的输出可能会在kdb版本之间发生变化您可以使用Charlie Skelton在k4列表框中提出的这一技巧来实现:
thisFile:hsym`$(reverse value {})2;
thisPath:first` vs thisFile;
otherFile:` sv thisPath,`other.q;
一些注意事项-只有当代码作为脚本的一部分运行时,它才起作用,也就是说,如果您在会话或IDE中手动运行这些行,它就不起作用。第二个警告是,如果您使用\ \来扰乱您的q脚本,那么它将不起作用。第三个警告是,在您执行任何可能影响其的操作之前,a.q顶部kdb版本之间的值输出可能会发生变化:
startDir: ` sv (hsym `$system"cd";first ` vs .z.f);
这将为您提供一个指向a.q目录的完全限定路径,然后您可以使用该路径加载b.q:
system "l ", 1_ string ` sv (startDir;`b.q);
在a.q的顶端,在你做任何可能影响它的事情之前:
startDir: ` sv (hsym `$system"cd";first ` vs .z.f);
这将为您提供一个指向a.q目录的完全限定路径,然后您可以使用该路径加载b.q:
system "l ", 1_ string ` sv (startDir;`b.q);