我想要做的就是在命令行中看起来像这样:
>>> import mymodule
>>> names = dir(mymodule)
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得中定义的所有名称引用mymodule从内部mymodule本身?
像这样的东西:
# mymodule.py
names = dir(__thismodule__)
Run Code Online (Sandbox Code Playgroud) 情况: - 我的project_folder中有一个名为calendar的模块 - 我想使用Python库中的内置Calendar类 - 当我使用日历导入日历时,它会抱怨因为它试图从我的模块加载.
我做了一些搜索,似乎无法找到问题的解决方案.
任何想法,而无需重命名我的模块?
我有一个类似于以下的目录结构
meta_project
project1
__init__.py
lib
module.py
__init__.py
notebook_folder
notebook.jpynb
Run Code Online (Sandbox Code Playgroud)
当notebook.jpynb我尝试使用相对导入来访问函数function()时module.py使用:
from ..project1.lib.module import function
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
SystemError Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个使用相对导入工作?
请注意,笔记本服务器在meta_project目录级别实例化,因此它应该可以访问这些文件中的信息.
另请注意,至少与最初的预期project1并未被视为模块,因此没有__init__.py文件,它只是作为文件系统目录.如果问题的解决方案需要将其视为一个模块并包含一个__init__.py文件(即使是空白文件),那么这样做是不错的,但这样做不足以解决问题.
我在机器和相对导入之间共享这个目录允许我在任何地方使用相同的代码,并且我经常使用笔记本进行快速原型设计,因此涉及黑客攻击绝对路径的建议不太可能有用.
编辑:这与Python 3中的相对导入不同,Python 3通常讨论Python 3中的相对导入,特别是从包目录中运行脚本.这与在jupyter笔记本中工作有关,该笔记本试图在另一个具有不同的一般和特定方面的目录中的本地模块中调用函数.
如何.py在Python 3.3+中导入任意python源文件(其文件名可以包含任何字符,并不总是以其结尾)?
我使用imp.load_module如下:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Run Code Online (Sandbox Code Playgroud)
它仍然适用于Python 3.3,但根据imp.load_module文档,它已被弃用:
从版本3.3开始不推荐使用:不需要使用加载器来加载模块,并且不推荐使用find_module().
和imp模块文档建议使用importlib:
注意新程序应使用importlib而不是此模块.
在不使用已弃用的imp.load_module函数的情况下,在Python 3.3+中加载任意python源文件的正确方法是什么?
我有一个模块foo,包含util.py和bar.py.
我想在IDLE或python会话中导入它.我该怎么做?
我找不到关于如何导入不在当前目录或默认python PATH中的模块的文档.尝试后import "<full path>/foo/util.py",和from "<full path>" import util
我能得到的最接近的是
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')
Run Code Online (Sandbox Code Playgroud)
这给了我在Windows 7上的权限被拒绝.
如何根据Python的完整路径在Python 3.4中加载Python模块?
类似的问题如何在给定完整路径的情况下导入模块?涵盖了3.4之前的Python版本,但结论是Python 3.4中的支持已经弃用了所提出的答案,因此对于Python 3.4的任何解决方案都表示赞赏.
请注意,此问题不是Import abitrary python源文件的副本.(Python 3.3+),因为对此的回答也使用loader.load_module()了Python 3.4中不推荐使用的内容,如回答所述,详细介绍请考虑将importlib.abc.Loader.load_module()和文档放在importlib中.
因此,需要在Python 3.4中通过完整路径导入模块的支持解决方案.
我有这种文件结构(目录和箭头文件后):
model -> py_file.py
report -> other_py_file.py
Run Code Online (Sandbox Code Playgroud)
主要__init__.py:
import model
import report
Run Code Online (Sandbox Code Playgroud)
型号目录:
import py_file
Run Code Online (Sandbox Code Playgroud)
报告目录:
import other_py_file
Run Code Online (Sandbox Code Playgroud)
现在在other_py_file我想要导入py_file,但是我尝试了什么,我给出错误,没有这样的模块.
我试过这个:
from model import py_file
然后:
import py_file
看起来这两个文件夹看不到对方.从其他目录导入文件的方法是什么?我是否需要在init .py文件中指定一些额外的导入?
标准库清楚地记录了如何直接导入源文件(给定源文件的绝对文件路径),但如果源文件使用隐式同级导入,则此方法不起作用,如下例所示.
如果这个例子适用于隐式兄弟导入的存在?
我已经签出这个和这个其他的话题#1的问题,但他们并没有解决隐同级进口内用手导入的文件.
这是一个说明性的例子
目录结构:
root/
- directory/
- app.py
- folder/
- implicit_sibling_import.py
- lib.py
Run Code Online (Sandbox Code Playgroud)
app.py:
import os
import importlib.util
# construct absolute paths
root = os.path.abspath(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
isi_path = os.path.join(root, 'folder', 'implicit_sibling_import.py')
def path_import(absolute_path):
'''implementation taken from https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly'''
spec = importlib.util.spec_from_file_location(absolute_path, absolute_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
isi = path_import(isi_path)
print(isi.hello_wrapper())
Run Code Online (Sandbox Code Playgroud)
lib.py:
def hello():
return 'world'
Run Code Online (Sandbox Code Playgroud)
implicit_sibling_import.py:
import lib # this is the …Run Code Online (Sandbox Code Playgroud) 我正在尝试将python文件导入我的应用程序,该文件是用python编写的.
我有以下代码:
import os
from os.path import basename
class specificClass:
def dothing(self,path):
runcommand = __import__("/root/"+ os.path.splitext(os.path.basename(path))[0]+ "/" + os.path.splitext(os.path.basename(path))[0] +"/sa/update.py")
runcommand.main()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它给我以下错误:
ImportError: Import by filename is not supported.
Run Code Online (Sandbox Code Playgroud)