相关疑难解决方法(0)

如何导入给定完整​​路径的软件包?

我的问题类似于如何在给定完整路径的情况下导入模块?但是,我没有导入.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。我的以下 …

python python-importlib python-3.5

7
推荐指数
0
解决办法
908
查看次数

在python中安装'lr_utils'的问题

我正在尝试在DeepLearning任务中完成一些作业[ deeplearning.ai由Andrew NG博士(斯坦福大学)].

当我在Coursera平台上尝试分配时,一切正常,但是,当我尝试imports在我的本地机器上执行相同操作时,它会给我一个错误,

ModuleNotFoundError: No module named 'lr_utils'

我已尝试通过安装解决问题lr_utils但无济于事.

网上没有提到这个模块(让我感到有些惊讶),现在我开始怀疑这是否是专有的deeplearning.ai

或者我们可以用任何其他方式解决这个问题!

python dataset anaconda conda deep-learning

7
推荐指数
5
解决办法
1万
查看次数

给定其vars dict的模块实例

假设我有一个模块的字典(通过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

7
推荐指数
1
解决办法
111
查看次数

导入具有相同名称的python模块

我有几个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 import module

6
推荐指数
1
解决办法
4247
查看次数

告诉__import__在哪里看 - 我是否坚持使用sys.path?

我有一个纯Python的项目和一个基本的插件系统:你编写一个模块来定义一个具有特定接口和名称的类,程序导入模块,然后根据需要实例化该类.

目前,插件都来自特定文件夹(主.py文件所在的子目录).我希望能够将它们放在磁盘上的其他位置,并指示程序在特定位置查找插件.对于一次性动态导入,我能以比修改更简洁的方式执行此操作sys.path吗?我不想污染这种全球性的.

相关:我可以依靠sys.path[0]成为脚本的路径,即使它与当前工作目录(os.getcwd())不同吗?

编辑:我忘了提 - 我希望能够从几个不同的文件夹中获取插件,用户指定插件文件夹的路径.目前,这些文件夹中的每一个都被设置为一个包(带有__init__.py); 如果它导致问题,我可以简单地废弃它.

python

6
推荐指数
1
解决办法
1084
查看次数

如何从另一个脚本运行Python脚本并获得最终的全局字典?

假设您有一个包含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__的问题.

python python-3.x

6
推荐指数
1
解决办法
1533
查看次数

从 PostgreSQL 存储过程导入 Python 文件

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 方法来导入文件。但最好的方法是下面的正确答案,它类似于我原来的解决方案,但更好。

python postgresql stored-procedures

6
推荐指数
1
解决办法
1319
查看次数

使用相对导入动态导入模块的正确方法?

我需要从另一个包中动态地将模块导入到我的项目中.

结构如下:

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'未加载,无法执行相对导入

我究竟做错了什么?

python import dynamic

6
推荐指数
2
解决办法
1万
查看次数

来自文件的 Python 动态导入方法

我有多个文件,其结构类似于文件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但它只能导入一个类,而不是只定义了方法的文件。谢谢您的帮助。

python

6
推荐指数
1
解决办法
1万
查看次数

从 AWS Lambda /tmp 目录导入 python 包

我正在尝试将一个 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 amazon-web-services aws-lambda

6
推荐指数
1
解决办法
3818
查看次数