我在使用Python 3.4.2 的Jupyter Notebook服务器(v4.2.2)上,我想使用全局名称__file__,因为笔记本将从其他用户克隆,并且我必须运行一个部分:
def __init__(self, trainingSamplesFolder='samples', maskFolder='masks'):
self.trainingSamplesFolder = self.__getAbsPath(trainingSamplesFolder)
self.maskFolder = self.__getAbsPath(maskFolder)
def __getAbsPath(self, path):
if os.path.isabs(path):
return path
else:
return os.path.join(os.path.dirname(__file__), path)
Run Code Online (Sandbox Code Playgroud)
的__getAbsPath(self, path)检查是否一个path参数是相对或绝对路径和返回的绝对版本path.所以我可以path稍后安全地使用.
但是我得到了错误
NameError:
'__file__'未定义名称
我在网上搜索了这个错误并找到了我应该更好地使用的"解决方案" sys.argv[0],但是print(sys.argv[0])返回了
/usr/local/lib/python3.4/dist-packages/ipykernel/__main__.py
但正确的笔记本位置应该是/home/ubuntu/notebooks/.
感谢您的参考如何从Martijn Pieters 获取当前的IPython Notebook名称(评论),最后的答案(不接受)非常适合我的需求:
print(os.getcwd())
/家庭/ Ubuntu的电脑/笔记本电脑
是否有获取笔记本路径的功能?
我在谷歌上搜索了一些关于这个主题但没有找到一个简单的方法来做到这一点......我想获得笔记本的路径,以便我可以在其他地方使用它。这样我就可以在与笔记本相同的路径中保存/使用文件,而不必担心它被保存在哪里。
现在我的解决方案是将以下代码放在最上面,但显然这至少会带来必须手动执行单元格的问题,而且如果工作目录发生更改,这将停止工作。
import os
current_path = os.getcwd()
Run Code Online (Sandbox Code Playgroud) 我的服务器运行许多长时间运行的笔记本电脑,我想监控笔记本电脑的内存.
有没有办法在pid或进程名称和笔记本之间进行匹配?
有没有办法让函数(由IPython Notebook单元调用)检索JavaScript变量的内容(例如IPython.notebook.notebook_path,其中包含当前笔记本的路径)?
直接在单元格中编写时,以下情况很有效(例如,基于此问题及其注释):
from IPython.display import display,Javascript
Javascript('IPython.notebook.kernel.execute("mypath = " + "\'"+IPython.notebook.notebook_path+"\'");')
Run Code Online (Sandbox Code Playgroud)
但是,如果我试图把它放在一个函数中,那就会崩溃:
# this doesn't work
from IPython.display import display,Javascript
def getname():
my_js = """
IPython.notebook.kernel.execute("mypath = " + "\'"+IPython.notebook.notebook_path+"\'");
"""
Javascript(my_js)
return mypath
Run Code Online (Sandbox Code Playgroud)
(是的,我一直试图让global该mypath变量,无论是从内my_js.脚本,并从函数中还要注意:不要吃剩的可能值从以前的命令变量所迷惑,以确保使用mypath = None; del mypath重置调用函数之前的变量,或者重启内核.)
制定问题的另一种方法是:"变量设定的范围(时间和地点)是IPython.notebook.kernel.execute()什么?"
我认为这不是一个无关紧要的问题,可能与IPython用来控制其内核及其变量的机制有关,而且我对此并不了解.以下实验说明了该机制的某些方面.以下工作在两个单独的单元格中完成,但如果两个单元格合并则不起作用:
细胞[1]:
my_out = None
del my_out
my_js = """
IPython.notebook.kernel.execute("my_out = 'hello world'");
"""
Javascript(my_js)
Run Code Online (Sandbox Code Playgroud)
细胞[2]:
print(my_out)
Run Code Online (Sandbox Code Playgroud)
这有效并产生预期的效果hello world …
我想将当前运行的 Jupyter 笔记本名称存储在 python 变量中。我创建了 2 个单元格
from IPython.display import display,Javascript
Javascript('IPython.notebook.kernel.execute("notebook_name = " + "\'"+IPython.notebook.notebook_name+"\'");')
Run Code Online (Sandbox Code Playgroud)
和
notebook_name
Run Code Online (Sandbox Code Playgroud)
如果我一个接一个地执行单元格,这可以正常工作,但我主要使用“运行所有单元格”命令执行单元格,在这种情况下,我收到错误消息:
NameError: name 'notebook_name' is not defined
Run Code Online (Sandbox Code Playgroud)
如果我将前 2 个单元格合并为 1 个单元格,我会得到同样的错误。我相信这是由于 python 和 JavaScript 之间的同步。任何帮助表示赞赏。
我有一个 Jupyter Notebook 正在运行。我希望能够从 Python 中访问当前 Jupyter Notebook 的源代码。我的最终目标是将其传入,ast.parse以便我可以对用户的代码进行一些分析。理想情况下,我可以做这样的事情:
import ast
ast.parse(get_notebooks_code())
Run Code Online (Sandbox Code Playgroud)
显然,如果源代码是 IPYNB 文件,则需要从 Python 单元中提取代码的中间步骤,但这是一个相对容易解决的问题。
到目前为止,我已经找到了将使用list_running_serversIPython 对象的函数来发出请求并匹配内核 ID 的代码 - 这为我提供了当前正在运行的笔记本的文件名。这会起作用,但磁盘上的源代码可能与用户在浏览器中的内容不匹配(直到您保存新的检查点)。
我已经看到一些涉及使用 JavaScript 提取数据的想法,但这需要一个带有魔法的单独单元格或调用 display.Javascript 函数 - 异步触发,因此不允许我将结果传递给ast.parse.
对于如何在 Python 中以字符串形式动态获取当前笔记本源代码以供立即处理,任何人都有任何聪明的想法?如果我需要使它成为扩展甚至内核包装器,我完全没问题,我只需要以某种方式获取源代码。
jupyter笔记本是否有可能获得自己的文件名,类似于我们从python脚本执行的操作吗?
os.path.basename(__file__) 似乎不起作用,至少对于jupyterlab上的我来说
sys.argv[0] 退货 my_home/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py
我正在 JupyterLab 中创建服务器端扩展,并且一直在寻找一种方法来获取 index.ts 文件中当前活动的笔记本名称。我发现这个现有的扩展可以获取当前活动的选项卡名称,ILabShell并将浏览器选项卡设置为具有相同的名称。就我而言,我将使用笔记本工具栏上的按钮触发该过程,因此活动选项卡将始终是笔记本。activate但是,当我尝试使用扩展部分中的代码时,我得到了TypeError: labShell.currentChanged is undefinedwherelabShell是 的实例ILabShell。该扩展不支持 JupyterLab 3.0+,所以我认为这是问题的一部分。然而,currentChangedfor在这里ILabShell被明确定义。如果我可以改变什么以使其发挥作用怎么办?还有其他方法可以完成我想做的事情吗?我知道类似这样的事情可以在笔记本中获取笔记本名称,但这并不是我想要做的。
Windows 10、
节点 v14.17.0、
npm 6.14.13、
jlpm 1.21.1、
jupyter lab 3.0.14
我使用此示例服务器扩展作为模板:https ://github.com/jupyterlab/extension-examples/tree/master/server-extension
从现有扩展的 index.ts 文件获取当前选项卡名称:
import {
ILabShell,
JupyterFrontEnd,
JupyterFrontEndPlugin
} from '@jupyterlab/application';
import { Title, Widget } from '@lumino/widgets';
/**
* Initialization data for the jupyterlab-active-as-tab-name extension.
*/
const extension: JupyterFrontEndPlugin<void> = {
id: 'jupyterlab-active-as-tab-name',
autoStart: true, …Run Code Online (Sandbox Code Playgroud) 大家好,
正如我的标题所暗示的那样,我想访问笔记本名称(在jupyter-lab 中)作为变量。所以我可以在笔记本本身中重用它(例如命名笔记本中生成的一些图形文件)。
我看到几年前打开了一个类似的问题[see here]。但是我没有找到满意的答案。
import ipyparams
Run Code Online (Sandbox Code Playgroud)
currentNotebook = ipyparams.notebook_name
Run Code Online (Sandbox Code Playgroud)
但是,它对我不起作用。我第一次执行第一个单元格时收到此警告:
import ipyparams
Javascript Error: Jupyter is not defined
Run Code Online (Sandbox Code Playgroud)
currentNotebook = ipyparams.notebook_name
Run Code Online (Sandbox Code Playgroud)
currentNotebook
''
Run Code Online (Sandbox Code Playgroud)
然后,如果我再次重新运行该单元格,则不再有警告消息,但变量currentNotebook仍然为空。(我按顺序运行单元格,我没有执行“运行所有单元格”)。
我的 Jupyter 版本是
jupyter notebook --version
6.0.3]
jupyter-lab --version
2.1.1
Run Code Online (Sandbox Code Playgroud)
我的笔记本主要用于python代码。
@juan 解决方案 [这里],使用ipynbname正在为
jupyter-notebook : 6.1.6
jupyter lab : 2.2.6
Run Code Online (Sandbox Code Playgroud)
但此解决方案仍然不适用于 jupyter lab : 3.0.1
ipynbname现在适用于 jupyter 3
关于它的更多细节[ …
我试图在使用 VSCode 时获取当前 Jupyter 笔记本的路径。
我尝试了这篇文章中的所有解决方案,但它们都不适用于 VSCode。我可以让他们通过 Jupyterlab 工作。
当我尝试涉及 %%javascript 魔术命令的解决方案时,该单元将成功执行,但内核不会使用包含笔记本名称的变量进行更新。
python ×7
jupyter ×5
jupyter-lab ×3
javascript ×2
ipython ×1
path ×1
python-3.x ×1
python-os ×1