我的问题类似于如何在给定完整路径的情况下导入模块?但是,我没有导入.py源文件,而是导入了带有.pyd的程序包。
在运行时,我根据一些动态生成的c代码创建新的软件包模块。我成功生成了包含__init__.py文件和F的软件包Foo mod.pyd:
/a/temp/dir/foo/
__init__.py
bar.pyd
Run Code Online (Sandbox Code Playgroud)
我正在使用的示例代码是
import importlib.util
spec = importlib.util.spec_from_file_location("foo.bar", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.bar()
Run Code Online (Sandbox Code Playgroud)
如果我尝试从pyd 使用spec_from_file_location('foo.bar', '/a/temp/dir/foo/__init__.py')模块bar,则无法加载。
如果我尝试使用,spec_from_file_location('foo.bar', '/a/temp/dir/foo/')则spec_from_file_location返回None。
如果尝试使用spec_from_file_location('foo.bar', '/a/temp/dir/foo/bar.pyd'),则会出现以下错误堆栈:
File "<frozen importlib._bootstrap>", line 577, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 903, in create_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.
Run Code Online (Sandbox Code Playgroud)
推荐的4行importlib解决方案的替代方法是为MetaPathFinder和创建具体的类SourceLoader。我的以下 …
我正在尝试在DeepLearning任务中完成一些作业[ deeplearning.ai由Andrew NG博士(斯坦福大学)].
当我在Coursera平台上尝试分配时,一切正常,但是,当我尝试imports在我的本地机器上执行相同操作时,它会给我一个错误,
ModuleNotFoundError: No module named 'lr_utils'
我已尝试通过安装解决问题lr_utils但无济于事.
网上没有提到这个模块(让我感到有些惊讶),现在我开始怀疑这是否是专有的deeplearning.ai?
或者我们可以用任何其他方式解决这个问题!
假设我有一个模块的字典(通过vars(mod),或mod.__dict__,或globals()),例如:
import mod
d = vars(mod)
Run Code Online (Sandbox Code Playgroud)
有了dict d,我该如何找回模块mod?即我想编写一个函数get_mod_from_dict(d),如果字典属于某个模块,则返回该模块,或者None:
>>> get_mod_from_dict(d)
<module 'mod'>
Run Code Online (Sandbox Code Playgroud)
如果get_mod_from_dict返回模块,则必须具有:
mod = get_mod_from_dict(d)
assert mod is None or mod.__dict__ is d
Run Code Online (Sandbox Code Playgroud)
我实际上可以这样实现:
def get_mod_from_dict(d):
mods = {id(mod.__dict__): mod for (modname, mod) in sys.modules.items()
if mod and modname != "__main__"}
return mods.get(id(d), None)
Run Code Online (Sandbox Code Playgroud)
但是,对我来说,遍历这似乎效率很低sys.modules。
有没有更好的办法?
我为什么需要这个?
在某些情况下,您只能访问字典。例如在堆栈框架中。然后,根据您想做什么,也许只是出于检查/调试的目的,找回模块很有帮助。
我写了一些扩展程序Pickler,可以使方法,函数等腌制。其中一些引用了模块或模块字典。在腌制过程中,无论我有一个属于模块的字典,我都不想腌制该字典,而要引用该模块。
我有几个python项目,他们都有一个conf包:
/some_folder/project_1/
conf/
__init__.py
some_source_file.py
/another_folder/project_2/
conf/
__init__.py
another_source_file.py
Run Code Online (Sandbox Code Playgroud)
对于每个项目,我在site-packages文件夹中使用以下内容创建了一个.pth文件:
.../site-packages/project_1.pth:
import sys; sys.path.append('/some_folder/project_1/')
.../site-packages/project_2.pth:
import sys; sys.path.append('/another_folder/project_2/')
Run Code Online (Sandbox Code Playgroud)
我可以访问以下模块/some_folder/project_1/:
import conf.some_source_file
Run Code Online (Sandbox Code Playgroud)
但不是以下模块/another_folder/project_2/:
import conf.another_source_file
AttributeError: 'module' object has no attribute 'another_source_file'
Run Code Online (Sandbox Code Playgroud)
看起来好像python只搜索conf任何文件夹下面的第一个路径sys.path.有办法解决这个问题吗?
我有一个纯Python的项目和一个基本的插件系统:你编写一个模块来定义一个具有特定接口和名称的类,程序导入模块,然后根据需要实例化该类.
目前,插件都来自特定文件夹(主.py文件所在的子目录).我希望能够将它们放在磁盘上的其他位置,并指示程序在特定位置查找插件.对于一次性动态导入,我能以比修改更简洁的方式执行此操作sys.path吗?我不想污染这种全球性的.
相关:我可以依靠sys.path[0]成为脚本的路径,即使它与当前工作目录(os.getcwd())不同吗?
编辑:我忘了提 - 我希望能够从几个不同的文件夹中获取插件,用户指定插件文件夹的路径.目前,这些文件夹中的每一个都被设置为一个包(带有__init__.py); 如果它导致问题,我可以简单地废弃它.
假设您有一个包含Python脚本路径的字符串,并且您希望以透明的方式加载和执行该脚本(因此与通过"python path"直接运行相比,内部脚本没有根本区别).然后得到由此产生的全局字典.我认为runpy.run_path()会这样做,但有两个问题.如果路径包含某些unicode字符,则它不起作用(请参阅http://bugs.python.org/issue17588).最重要的是,鉴于全局字典只是原始字典的副本,因为当临时模块对象被垃圾收集时,这个原始字典被清除.所以函数对象已经损坏__globals__ dict(参见http://bugs.python.org/issue18331).
你有任何想法如何运行内部脚本?
更新:请参阅我目前的方法 - http://bpaste.net/show/RzAbQxLNXiJsXYm2fplz/.有什么建议?改进?例如,关于正在运行的脚本的观点可能有什么不同的细节.我知道有关realoading __main__的问题.
PostgreSQL 存储过程中可以包含 Python 代码。例如:
CREATE FUNCTION someProc()
RETURNS void AS $$
# Some Python3 code...
$$ LANGUAGE plpython3u;
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能从这段代码中包含一个Python文件呢?
PostgreSQL中运行的Python的当前目录是这样的:
>>> os.getcwd()
... /var/lib/postgresql/9.3/main
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,效果很好:
CREATE FUNCTION someProc()
RETURNS void AS $$
import sys
sys.path.append("/dir/to/file")
from python_file import pythonFunction
# More Python code
$$ LANGUAGE plpython3u;
Run Code Online (Sandbox Code Playgroud)
由于许多明显的原因,这看起来不太好。有没有更好的方法来导入 python 文件,或者只是从 python 文件调用 python 函数?
编辑:没有任何特定的 PostgreSQL 方法来导入文件。但最好的方法是下面的正确答案,它类似于我原来的解决方案,但更好。
我需要从另一个包中动态地将模块导入到我的项目中.
结构如下:
project_folder/
project/
__init__.py
__main__.py
plugins/
__init__.py
plugin1/
__init__.py
...
plugin2/
__init__.py
...
Run Code Online (Sandbox Code Playgroud)
我做了这个函数来加载一个模块:
import os
from importlib.util import spec_from_file_location, module_from_spec
def load_module(path, name=""):
""" loads a module by path """
try:
name = name if name != "" else path.split(os.sep)[-1] # take the module name by default
spec = spec_from_file_location(name, os.path.join(path, "__init__.py"))
plugin_module = module_from_spec(spec)
spec.loader.exec_module(plugin_module)
return plugin_module
except Exception as e:
print("failed to load module", path, "-->", e)
Run Code Online (Sandbox Code Playgroud)
除非模块使用相对导入,否则它可以工作:
无法加载module/path/to/plugins/plugin1 - >父模块'plugin1'未加载,无法执行相对导入
我究竟做错了什么?
我有多个文件,其结构类似于文件example.py:
def initialize(context):
pass
def daj_omacku_teplu(context, data):
pass
def hmataj_pomaly(context, data):
pass
def chvatni_paku(context, data):
pass
def mikaj_laktom(context, data):
pass
Run Code Online (Sandbox Code Playgroud)
我需要能够在不同的 python 文件中从“example.py”动态导入方法,例如:
for fn in os.listdir('.'):
if os.path.isfile(fn):
from fn import mikaj_laktom
mikaj_laktom(example_context, sample_data)
Run Code Online (Sandbox Code Playgroud)
由于多种原因,我无法更改 的结构,example.py因此我需要制定一种机制来加载方法并评估它们。我尝试使用importlib但它只能导入一个类,而不是只定义了方法的文件。谢谢您的帮助。
我正在尝试将一个 zip 文件上传到 AWS Lambda,该文件主要包含 python 包,大小为 300MB。我清楚地了解,如果我们直接使用 AWS SDK 上传,这超出了可以上传到 Lambda 的 zip 的限制。因此,这是行不通的。
为了克服这个问题,我决定下载/tmp目录中的包并将它们导入到主文件中(参考此处)。我将所需的包压缩为pkgs.zip并将其上传到AWS S3。然后我使用requests将它们解压到 来下载它们/tmp/。
def get_pkgs(url):
import requests
import io
import zipfile
print("Getting Packages...")
re = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(re.content))
print("Extracting Packages...")
z.extractall("/tmp/")
print("Packages are downloaded and extracted.")
def attempt_import():
print("="*50)
print("ATTEMPT TO IMPORT DEPENDENCIES...")
print("="*50)
import numpy
import scipy
import six
print("IMPORTING DONE.")
def main():
URL = "https://s3-ap-southeast-1.amazonaws.com/BUCKET_NAME/pkgs.zip"
get_pkgs(URL)
attempt_import()
def lambda_handler(event, context):
main()
return …Run Code Online (Sandbox Code Playgroud) python ×10
import ×2
anaconda ×1
aws-lambda ×1
conda ×1
dataset ×1
dynamic ×1
module ×1
postgresql ×1
python-3.5 ×1
python-3.x ×1