import *在Python中使用函数(大概来自importlib)的等价物是什么?
我知道您可以导入一个模块mod = __import__(...),该模块将委托给当前配置的实现.你也可以这样做
mod_spec = importlib.utl.spec_from_file_location(...)
mod = importlib.util.module_from_spec(mod_spec)
mod_spec.loader.exec_module(mod)
Run Code Online (Sandbox Code Playgroud)
这允许你做一些疯狂的事情,比如通过在调用之前插入东西将东西注入模块exec_module.(由/sf/answers/4738471/和/sf/answers/2705561491/提供)
但是,我的问题仍然存在.import *功能形式如何工作?什么函数根据存在/内容确定从模块加载哪些名称__all__?
我有一个django项目,我在docstrings中使用reST来记录以下内容:
我的文档在IDE(PyCharm)中正确显示,但我无法配置Sphinx为我生成HTML文档.
这是我的项目的结构
+--------------------------------------------+
| /saassapp # django project path |
| /docs # dir for sphinx |
| conf.py # sphinx config file |
| ... |
| settings.py # django settings |
| /studyview # django app |
| ...
| ... |
+--------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?对conf.py文件的检查非常有用.谢谢.
编辑
我的项目名称是saassapp,我试图制作文档的模块叫做studyview.
conf.py文件:http://pastebin.com/HTYdc1rRindex文件:http://pastebin.com/bu1r38TQmake html:http://pastebin.com/MWJj94EEpython django documentation documentation-generation python-sphinx
我有一个/etc/default/foo包含一行的文本文件:
FOO="/path/to/foo"
Run Code Online (Sandbox Code Playgroud)
在我的python脚本中,我需要引用变量FOO.
将文件"源" /etc/default/foo到我的python脚本中的最简单方法是什么,就像我在bash中一样?
. /etc/default/foo
Run Code Online (Sandbox Code Playgroud) 我有一个叫做'my_class'放入的课程'my_module'.我需要导入这个类.我试着这样做:
import importlib
result = importlib.import_module('my_module.my_class')
Run Code Online (Sandbox Code Playgroud)
但它说:
ImportError: No module named 'my_module.my_class'; 'my_module' is not a package
Run Code Online (Sandbox Code Playgroud)
所以.我可以看到它只适用于模块,但不能处理类.如何从模块导入类?
我正在尝试使用Windows 8,Anaconda和iPython 阅读shapefile,以便在本教程之后查看城市中的郊区.
我在命令提示符下尝试了"conda install shapefile"和"pip install shapefile",两者都返回"错误:找不到匹配的包:shapefile".
除此之外,我尝试按照这些链接手动添加它[1] 如何在给定完整路径的情况下导入模块? [2] 导入python模块不在路径上.但是我收到许可错误,这表明我无论如何都没有正确导入它们.
有关如何进行或最佳实践的任何建议表示赞赏.
我有这样的目录结构......
dir/
build.py
dir2
dir3/
packages.py
Run Code Online (Sandbox Code Playgroud)
现在的build.py需求packages.py- 并注意dir2不是一个包.
那么什么是packages.py加载的最佳方式build.py(目录结构无法更改)
编辑
该sys.path.append解决方案似乎不错-但有一两件事-我需要使用packages.py很少的文件-并保持sys.path包括很少使用的目录,但在前面-那是最好的事情?
编辑二
我认为imp解决方案是最好的.
import imp
packages = imp.load_source('packages', '/path/to/packages.py')
Run Code Online (Sandbox Code Playgroud)
编辑III
请注意,imp.load_source其他一些功能已被弃用.所以你应该使用imp.load_module今天.
fp, pathname, description = imp.find_module('packages', '/path/to/packages.py')
try:
mod = imp.load_module('packages', fp, pathname, description)
finally:
# since we may exit via an exception, close fp explicitly
if fp:
fp.close()
Run Code Online (Sandbox Code Playgroud) 有很多关于如何导入相关包或通过显式位置的python问题(链接到两个流行示例)。
此外,总有 文档
读完这篇文章后,我仍然不太确定规范是什么,它们与模块的关系如何,以及为什么需要对其进行标记。
因此,对于不理解的人,您能否尝试解释一下如何做到这一点(以编程方式以及幕后的含义)
例如
如果我有
proj-dir
--mod1
--|--__init__.py
--|--class1.py
--mod2
--|--__init__.py
--|--class2.py
Run Code Online (Sandbox Code Playgroud)
如何将 mod2 导入 mod1?
import sys
sys.path.insert(0, "../mod2")
Run Code Online (Sandbox Code Playgroud)
这在技术上是有效的,但我担心如果我尝试腌制对象并在其他地方使用它们,将来可能会导致问题......
在明确定位建议
import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我只是这样做:
import importlib.util
spec = importlib.util.spec_from_file_location("mod2.class2", "../mod2/class2.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)
??
假设我有两个具有以下结构的项目:
/项目1
/项目2
现在我开发了一个对这两个项目都有用的函数/类。我想把它放在 project1/project2 目录之外的某个地方,并将它作为一个单独的项目进行维护。所以我可能需要这样的结构:
/项目1
/项目2
/共享
如果我将辅助函数/类放在共享文件夹中的项目中,如何从 project1/project2 使用它们?
目前我的选择是在 project1/project2 中使用 sys.path.append('/shared') ,然后从共享文件夹导入。
有没有更多的pythonic方法来做同样的事情?
所以我试图改变一堆"来自x import x"的语句,看起来像这样:
from class_foo import class_foo
Run Code Online (Sandbox Code Playgroud)
变成动态的东西.我正在尝试将路径传递到目录并让它导入其中的所有模块.
def dynamicImport(dirPath):
filez = os.listdir(dirPath)
for file in filez:
if "class" in file:
oname = file[:-3] #cut off the file extension, trivial
imp_statement = "from " + oname + " import " + oname
#when I print imp_statement, I can verify it's being concatenated correctly
exec(imp_statement)
Run Code Online (Sandbox Code Playgroud)
当我运行此函数并将其传递给路径时,语句字符串正在正确创建并且不会产生错误,但稍后我将尝试访问其中一个导入的对象,并且会发生以下情况:
foo = class_foo()
NameError: name 'class_foo' is not defined
Run Code Online (Sandbox Code Playgroud)
显然,我做错了什么.任何帮助,将不胜感激.
为了改善我的Python风格,我在我的一个脚本上运行了一个PEP-8样式检查器,它抱怨我不知道如何修复.脚本的序言如下:
#! /bin/env python3
import sys
import os
exe_name = os.path.basename(os.path.realpath(__file__))
bin_dir = os.path.dirname(os.path.realpath(__file__))
inst_dir = os.path.dirname(bin_dir)
sys.path.insert(0, inst_dir+'/path/to/packages')
import mypackage.mymodule
Run Code Online (Sandbox Code Playgroud)
并且样式检查器在线上抱怨import mymodule,声明它应该是文件的顶部.但在设置找到它的路径之前,我显然无法移动它.有没有一种很好的方法来实现这一点(强制要求环境变量或shell包装器不是我认为比现有代码更好的)同时尊重PEP-8建议?
python ×9
python-3.x ×4
anaconda ×1
bash ×1
django ×1
gis ×1
ipython ×1
matplotlib ×1
pep8 ×1
python-2.7 ×1