相关疑难解决方法(0)

如何从另一个脚本运行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万
查看次数

导入目录中的所有模块

有没有办法导入当前目录中的所有模块,并返回它们的列表?

例如,对于具有以下目录的目录:

  • mod.py
  • mod2.py
  • mod3.py

它会给你 [<module 'mod'>, <module 'mod2'>, <module 'mod3'>]

python module

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

使用inspect.getmembers

我正在尝试用来inspect.getmembers检查文件中的类和函数.问题是我不知道如何在inspect.getmembers不使用的情况下将文件名传递给import.那是因为我每次都需要指定一个不同的文件名

代码看起来类似于:

def extractName(self,fileName):

    for name, obj in inspect.getmembers(FileName):
        if inspect.isclass(obj):

            print "this is class",name


    if inspect.isfunction(obj):

        print "this is method",name
Run Code Online (Sandbox Code Playgroud)

python inspect

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

从所有文件夹递归导入所有.py文件

给定一个根目录,我需要从该根目录下的所有文件夹(以及其他文件夹内的文件夹)中导入所有文件。

我认为可以在的帮助下完成此操作os.walk(),但不知道在“遍历”文件后如何导入文件。

是否有捷径可寻?

import recursion python-3.x python-3.4

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

imp.load_source方法的第一个参数是做什么的?

我正在读这个关于从绝对路径导入模块的问题.答案建议使用以下代码:

import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)

我想从具有以下结构的dir导入文件(它是包):

__int__.py
model_params.py
Run Code Online (Sandbox Code Playgroud)

我这样做了:

import01 = imp.load_source('module.name', '/home/wakatana/experiments/model_params/model_params.py')
Run Code Online (Sandbox Code Playgroud)

现在我可以访问model_params.pyvia中的变量了import01.VARIABLE_NAME.这似乎相当于import numpy as np.哪里model_params.py是喜欢numpy和import01喜欢np.

我想问一下load_source方法的第一个参数是做什么的?help(imp)几乎没有关于load_source方法的说法,例如跟随help(imp.load_source)回报load_source(...)

谢谢

编辑基于behzad.nouri评论

在load_source的文档页面上说:

name参数用于创建或访问模块对象.

但是当我尝试访问时,module.name我得到一个关于未定义模块的错误.另外,为什么没有可以访问的文档,help我能以某种方式安装吗?我希望文档是python中代码本身的一部分,或者通常的做法是不内置它而是让它在线?

python module

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

为什么不支持按文件名导入?

我想导入 python 目录中的所有 python 模块,并遇到了以下代码片段:

for name in os.listdir("modules"):
    if name.endswith(".py"):
        module = name[:-3]   # remove extension name for convenience.
        globals()[module] = __import__(os.path.join("modules", name))
Run Code Online (Sandbox Code Playgroud)

程序输出:

ImportError: Import by filename is not supported.

如何按文件名导入文件?

python import python-import

5
推荐指数
0
解决办法
9859
查看次数

将pyi(类型存根文件)导入普通python模块

我有一个程序(如宏),它在父程序中运行并从该程序导入一个 API 模块(让我们称之为foo)。问题是该模块仅存在于该程序中,因此我无法执行诸如在软件外部运行pydocmd之类的操作,因为该脚本会引发 ReferenceError。为了帮助我自己的开发,我foo.pyi在我的项目目录中创建了一个类型存根文件。如果导入失败,我想要做的是将该类型存根作为普通 Python 文件导入,以提供虚拟函数和属性。就像是:

try:
  import foo
except ImportError:
  from . import foo.pyi
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误,因为它试图pyi从foo项目文件夹中不存在的库中导入。我能想到的唯一另一种选择是拥有 .pyi 文件的相同副本,比如“dummy_foo.py”,但我必须在一个 repo 中维护同一文件的两个副本。我宁愿不这样做。

python import stub python-import pyi

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

添加到 sys.path 与 PEP E402 的路径

为了导入位于磁盘上某处的项目特定模块,可以轻松地将此目录附加到 sys.path:

import sys
sys.path.append(some_module_path)

import some_module
Run Code Online (Sandbox Code Playgroud)

但是,后者的导入现在违反了 PEP E402(“模块级导入不在文件顶部”)。至少 spyder 是这样告诉我的。这里的spyder是不是太挑剔了?

在 spyder 中有一个“项目”的主要思想,我假设可以针对这个项目调整环境。但是,我不知道如何根据 spyder 项目修改例如 sys.path。

如何在 spyder 项目中修改 sys.path?或者是否有解决此问题的通用python方法?

python pep8 spyder

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