假设您有一个包含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'未加载,无法执行相对导入
我究竟做错了什么?
有没有办法导入当前目录中的所有模块,并返回它们的列表?
例如,对于具有以下目录的目录:
它会给你 [<module 'mod'>, <module 'mod2'>, <module 'mod3'>]
我正在尝试用来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) 给定一个根目录,我需要从该根目录下的所有文件夹(以及其他文件夹内的文件夹)中导入所有文件。
我认为可以在的帮助下完成此操作os.walk(),但不知道在“遍历”文件后如何导入文件。
是否有捷径可寻?
我正在读这个关于从绝对路径导入模块的问题.答案建议使用以下代码:
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 目录中的所有 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.
如何按文件名导入文件?
我有一个程序(如宏),它在父程序中运行并从该程序导入一个 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 中维护同一文件的两个副本。我宁愿不这样做。
为了导入位于磁盘上某处的项目特定模块,可以轻松地将此目录附加到 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 ×9
import ×4
module ×2
python-3.x ×2
dynamic ×1
inspect ×1
pep8 ×1
postgresql ×1
pyi ×1
python-3.4 ×1
recursion ×1
spyder ×1
stub ×1