如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,from .mymodule import myfunction但有时我会得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有时它适用from mymodule import myfunction,但有时我也得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我使用的是Python 3.5.1.我在这里阅读了文档和包部分:https://docs.python.org/3/tutorial/modules.html#packages
现在,我有以下结构:
/home/wujek/Playground/a/b/module.py
Run Code Online (Sandbox Code Playgroud)
module.py:
class Foo:
def __init__(self):
print('initializing Foo')
Run Code Online (Sandbox Code Playgroud)
现在,在/home/wujek/Playground:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Run Code Online (Sandbox Code Playgroud)
同样,现在在家里,超级文件夹Playground:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Run Code Online (Sandbox Code Playgroud)
实际上,我可以做各种各样的事情:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我虽然有被需要的__init__.py文件(空的都可以)两种a,并b为module.py要导入的时候Python的路径指向Playground文件夹?
这似乎已经从Python 2.7改变了:
~ $ PYTHONPATH=Playground …Run Code Online (Sandbox Code Playgroud) 我已经使用jupyter笔记本进行数据分析了很长一段时间.我想在我的jupyter notebook目录中开发一个模块,并能够将新模块导入到笔记本中.我的jupyter笔记本文件目录可以表示如下;
Jupyter notebooks\
notebook1.ipynb
new_module\
__init__.py
newfunction.py
currentnotebooks\
notebook2.ipynb
Run Code Online (Sandbox Code Playgroud)
当import new_module在notebook1.ipynb中使用时,它可以正常工作,当我在notebook2.ipynb中尝试相同的命令时,我得到以下内容ImportError: No module named 'new_module'.两个明显的解决方案是A)将new_module移动到currentnotebooks目录或B)将notebook2.ipynb移动到与new_module相同的级别.我根本不想乱用文件结构.这可能吗?
我有这样的文件结构:
project_folder/
notebooks/
notebook01.ipynb
notebook02.ipynb
...
notebookXY.ipynb
module01.py
module02.py
module03.py
Run Code Online (Sandbox Code Playgroud)
在.ipynb文件notebook/夹内的文件中,我想从module01.py, module02.py和导入类和函数module03.py。
我在这个问题中找到了答案,可以在每个笔记本中使用以下代码行并每次将这些行作为第一个单元格运行:
import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path)
Run Code Online (Sandbox Code Playgroud)
请问有更好的方法吗?如果.ipynb文件notebooks/夹中有很多文件,我是否必须在每个文件的开头粘贴这些代码行?有没有更好、更简约或更干净的方式?
我的问题与此有关。我在Jupyter Notebook中使用Python 3.6。我的项目目录是/user/project。在此目录中,我正在构建许多模型,每个模型都有自己的文件夹。但是,有一个通用的functions.py文件,其中包含我要在所有模型中使用的功能。所以,我想保留functions.py在文件中/user/project,但可以从一个调用它.ipynb的文件中/user/project/model1,/user/project/model2等...我怎样才能做到这一点?