Gau*_*sal 8 python-import python-3.x
我的问题与此有关。我在Jupyter Notebook中使用Python 3.6。我的项目目录是/user/project。在此目录中,我正在构建许多模型,每个模型都有自己的文件夹。但是,有一个通用的functions.py文件,其中包含我要在所有模型中使用的功能。所以,我想保留functions.py在文件中/user/project,但可以从一个调用它.ipynb的文件中/user/project/model1,/user/project/model2等...我怎样才能做到这一点?
adh*_*dhg 22
假设您有一个名为Jupyter的文件夹,并且您希望从另一个名为nn_webserver 的文件夹中导入模块(员工)。
可视化它:
做这个:
import sys
import os
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path+"\\nn_webserver")
from employee import motivation_to_work
Run Code Online (Sandbox Code Playgroud)
在此处查看来自@metakermit 的其他信息
hon*_*oon 13
没有简单的方法可以将python文件导入另一个目录。这与jupyter笔记本无关
这是您的问题的3种解决方案
import sys
sys.path.insert(0, '/path/to/application/app/folder')
import file
Run Code Online (Sandbox Code Playgroud)
您可以通过__init__.py在要导入的文件夹中保存一个空文件来创建本地模块。关于文件夹层次结构,您必须考虑一些奇怪的规则。
您可以为要导入的文件创建模块,然后将其全局安装。
Gus*_*s B 11
我一直在思考这个问题,因为我不喜欢这个sys.path.append()答案。我建议的解决方案使用内置的 Jupyter magic 命令来更改当前工作目录。假设您有以下文件结构:
project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model1\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook1.ipynb\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model2\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook2.ipynb\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 functions.py\nRun Code Online (Sandbox Code Playgroud)\n无论您想functions从notebook1.ipynb还是导入notebook2.ipynb,您都可以简单地在导入包的单元格之前添加一个包含以下行的单元格:
%cd ..\nRun Code Online (Sandbox Code Playgroud)\n这会将当前工作目录更改为笔记本的父目录,然后将函数模块的路径添加到 Python 将检查包的默认位置。导入functions:
project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model1\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook1.ipynb\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model2\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook2.ipynb\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 functions.py\nRun Code Online (Sandbox Code Playgroud)\n如果您想要导入的同一包目录中有多个模块,则这将类似地工作:
\nproject\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model1\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook1.ipynb\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 model2\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 notebook2.ipynb\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 package\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 functions1.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 functions2.py \nRun Code Online (Sandbox Code Playgroud)\n您可以导入这两个模块functions1,如下functions2所示package:
%cd ..\nRun Code Online (Sandbox Code Playgroud)\n编辑:如下所述,如果包含 magic 命令的单元运行多次(当前工作目录将在每次重新运行该命令时更改为上面的目录),则本地导入将不再起作用。为了防止这种情况发生,该%cd ..命令应该位于笔记本顶部和导入之前的自己的单元格中(而不是与导入位于同一单元格中) ,这样它就不会多次运行。重新启动内核并运行所有单元将重置当前工作目录,但仍会返回所需的导入/结果。
我建议functions.py在您的虚拟环境中作为包安装。这样做有一些好处:
functions.py从位于任何地方的任何 iPython 笔记本访问文件,但在给定的环境(内核)中。functions.py文件中的任何函数,你就不需要一次又一次地重新加载你的 iPython 笔记本。它会自动重新加载每次更改。这是如何做到的:
setup.py文件 ( https://docs.python.org/2/distutils/setupscript.html )pip install -e .然后,在您的 iPython 笔记本中:
%load_ext 自动重载
%自动重载 1
%aimport yourproject.functions
从函数导入 *
就是这样!
我已经通过创建在该目录中的符号链接解决了过去这个问题Jupyter笔记本位于就是了负载库,使蟒蛇的行为仿佛模块处于正确的路径。因此,对于上面的示例,您将在Jupyter单元内的每个目录中运行一次以下命令:
!ln -s /user/project/functions.py functions.py
Run Code Online (Sandbox Code Playgroud)
然后你可以导入
import functions
Run Code Online (Sandbox Code Playgroud)
注意:我只在 Linux 和 Mac Os 上尝试过这个,所以我不能保证 Windows。
除了 adhg 的答案之外,我建议使用 Pathlib,以实现 Linux/Windows/WSL 路径格式之间的兼容性:
\n假设以下文件夹结构:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 work\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 notebook.ipynb\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_python_file.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 py\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80modules\n| | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80__init__.py # empty\n| | \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80preparations.py\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80__init__.py # empty\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tools.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80.git\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README.md\nRun Code Online (Sandbox Code Playgroud)\n加载tools.py或preparations.py在my_python_file.py(或在笔记本中notebook.ipynb):
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 work\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 notebook.ipynb\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_python_file.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 py\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80modules\n| | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80__init__.py # empty\n| | \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80preparations.py\n| \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80__init__.py # empty\n| \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tools.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80.git\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 README.md\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
16260 次 |
| 最近记录: |