确定Java(NodeJS)代码是否正在REPL中运行

时间:2019-06-01 01:37:16

标签: node.js

我希望在使用IJavascript内核的Jupyter笔记本中创建一个NodeJS源文件,以便快速调试我的代码。工作完成后,即可使用Jupyter的“下载为...”功能将笔记本保存为NodeJS脚本文件。

我希望能够有选择地忽略/包含笔记本代码中的代码,这些代码在运行生成的NodeJS脚本文件时将不会执行。

我已经解决了为Python Jupyter笔记本做类似事情的问题,因为我可以确定代码是否在交互式会话中运行(IPython [REPL])。我通过在Python中使用此函数来完成此任务:

def is_interactive():
    import __main__ as main
    return not hasattr(main, '__file__')

(感谢https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS?redirectedfrom=MSDN

是否可以为NodeJS做类似的事情?

2 个答案:

答案 0 :(得分:0)

我不知道这是正确的方法,但找不到其他东西 基本上,如果您

try {
   const repl = __dirname
} catch (err) {
  //code run if repl
}

感觉有点,但可以工作\\ _(ツ)_ /¯

答案 1 :(得分:0)

最快,最可靠的途径就是查询流程参数。仅从NodeJS可执行文件中,有两种启动REPL的方法。在调用节点之后,您无需执行任何脚本即可执行 this 之类的操作。

node --experimental-modules ...

或者您使用interactive mode强制节点进入REPL。

node -i ...

v6.11.0 --中添加的选项结束参数将永远不会将参数附加到process.argv数组中,除非它在脚本模式下执行。通过FILE-p-e。用于NodeJS的所有参数都将被过滤到随附的process.execArgv变量中,因此process.argv数组中剩下的唯一内容应该是process.execPath。在这种情况下,我们可以将查询简化为以下解决方案。

const isREPL = process.execArgv.includes("-i") || process.argv.length === 1;

console.log(isREPL ? "You're in the REPL" : "You're running a script m8");

这不是最可靠的方法,因为任何用户都可以从启动器脚本实例化REPL,该脚本可用于运行该脚本。为此,我敢肯定,您可以使用人为错误来检索回溯并查找REPL条目。尽管我现在没有时间实施和确保该解决方案。