- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我自己编写了一个简单的函数来筛选我的 Python 文件夹并查找可能的模块所在的位置。我想做的很简单。我传递了一个模块导入字符串,该函数将找到模块的文件夹,在那里 cd,并将它导入到我正在工作的任何环境中,例如:
anyimport('from fun_abc import *')
最初我试过:
class anyimport(object):
def __init__(self, importmodule, pythonpath='/home/user/Python', finddir=finddir):
##################################################################
### A BUNCH OF CODES SCANNING THE DIRECTORY AND LOCATE THE ONE ###
##################################################################
### "pointdir" is where the directory of the file is ###
### "evalstr" is a string that looks like this : ---
### 'from yourmodule import *'
os.chdir(pointdir)
exec evalstr
当我在 iPython Notebook 中编写整个代码时,它可以正常工作。所以这个问题从我身边溜走了。然后我发现它不能正常工作,因为函数导入的模块留在函数的局部变量空间中。
然后我发现了这个 Stack Overflow 讨论 "In Python, why doesn't an import in an exec in a function work?" .因此,我将代码更改为以下内容:
class anyimport(object):
def __init__(self, importmodule, pythonpath='/home/user/Python', finddir=finddir):
##################################################################
### A BUNCH OF CODES SCANNING THE DIRECTORY AND LOCATE THE ONE ###
##################################################################
### "pointdir" is where the directory of the file is ###
### "evalstr" is a string that looks like this : ---
### 'from yourmodule import *'
sys.path.append(os.path.join(os.path.dirname(__file__), pointdir))
exec (evalstr, globals())
还是不行。该函数运行没有错误,但模块对我不可用,比如我运行 script.py
我在其中执行 anyimport('from fun_abc import *')
但没有来自 fun_abc
就在那里。 Python 会告诉我“NameError: name 'fun_you_want' is not defined”。
谁能给我指出正确的方向来解决这个问题?
感谢您的关注,非常感谢您的帮助!
除了@Noya 必须通过作用域才能使 exec
工作之外,为了避免“ImportError”,您还需要在运行 exec 之前添加这一行
:
sys.path.append(os.path.join(os.path.dirname(__file__), pointdir))
exec (evalstr, scope)
这是因为我们对 sys.path
的修改假设当前工作目录总是在 main/
中。我们需要将父目录添加到 sys.path
。请参阅此 Stack Overflow 讨论 "ImportError: No module named - Python"有关解决此问题的更多信息。
最佳答案
exec
在当前范围内执行代码。在函数内部,这意味着(函数-)局部作用域。
你可以告诉 exec
通过给它一个元组 (code, scope)
把变量放在另一个范围内。例如,您可以使用 globals()
使名称在模块级别可用。
请注意,globals
is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).
因此,在您的示例中,您必须将所需范围传递给实用程序函数:
anyimport.py:
class anyimport(object):
def __init__(self, importmodule, scope):
exec (importmodule, scope)
测试.py:
a = 42
b = 'foo'
main.py:
from anyimport import anyimport
if __name__ == '__main__':
anyimport('from test import *', globals())
# 42 foo
print a, b
用 python main.py
测试它。确保所有文件都存在于当前目录中。
如果您不一定要使用 exec
,更优雅的方法是使用 Python 提供的导入实用程序。
以下内容,摘自https://stackoverflow.com/a/4526709/453074 , 等同于 from some.package import *
:
[...] it's more convenient to user
importlib
:
globals().update(importlib.import_module('some.package').__dict__)
.
关于python - 如何使来自 exec ("import xxx"的模块在 Python 函数中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481170/
我从我的服务器获取此 IP,例如: "/177.127.101.68:53964" "/201.80.15.100:54263" "/177.67.38.54:51309" 我需要它就像“177.12
终端抛出此错误意味着什么以及如何解决它? packet_write_wait: Connection to xxx.xxx.xxx.xxx: Broken pipe 这是今天刚刚发生的事情。正常工作一
这应该是非常简单的,但我不能让它为我的生活工作。我只是想远程连接到我的MySQL服务器。。连接方式:。运作良好,但正在尝试:。失败,并显示以下错误:。错误1130(00000):不允许主机‘xxx.x
正在尝试将坞站映像推送到私有坞站存储库。但收到如下错误:“拨号tcp:lookup xxx.xxx:没有这样的主机”。我已正确登录到存储库,并且构建成功。。以下命令用于将映像推送到私有repo:sud
这个问题已经有答案了: Android 8: Cleartext HTTP traffic not permitted (37 个回答) 已关闭 3 年前。 这是 list 文件
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: A comprehensive regex for phone number validation 什么是正
尝试将 docker 镜像推送到私有(private) docker 存储库。但出现类似错误:“dial tcp:lookup xxx.xxx.xxx.xxx: no such host”。我已正确登
我搜索了 StackOverflow,并在尝试打开引用不同项目中的 UserControl 的表单时发现了类似的问题。 我明白 To prevent possible data loss before
我收到的错误是 com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.io.IOException: H
我需要用 preg_match 检查输入,它必须是这种格式:xxx.xxx.xxx block 的数量可以变化......这些都是有效输入的例子: 001 00a.00a 0fg.001 aaa.aa
在所有构建过程完成且没有任何错误后,我遇到了失败。 我不知道为什么会出现以下错误。 即使所有测试均已成功完成,此错误仍将作业状态标记为失败。致命:来自 socaautovm1.xxx.local/19
我有一个单独托管的 Postgres 数据库,我正试图将其与我的 Phoenix 应用程序一起使用。我的 prod 配置是: config :my_app, MyApp.Repo, adapter
我尝试使用 terraform 在 Azure 中创建负载均衡器,但收到此错误: Error: creating/updating Load Balancer "lbclassic" (Resourc
Java中是否有一个类可以让您将“102203345.32”之类的数字格式化为“102.203.345,32”并返回字符串类型? 我想获得一个字符串,其中千位由“.”分隔。小数点之间用逗号“,”分隔。
大家好,我已经通过大量在线编码来获取我的 android 手机 IP 地址大多数都以结尾 if (!inetAddress.isLoopbackAddress()) {
首先,我知道 this question .由于我既没有使用 maven 也没有使用 jenkins,因此无法使用提供的解决方案。 在使用 sonar-runner 分析我的项目时,我收到以下警告:
我的脚本有些问题。它应该通过代理打开一个网站,但我总是遇到这个错误,我正在尝试使用几个代理... 它会是什么? Traceback (most recent call last): File "C
我正在使用远程数据库在 PHP 下开发 Web 应用程序,其中我有以下测试脚本: try { $dbh = new PDO('mysql:host=XXX.XXX.XXX.XXX;dbname
我正在尝试使用 php-facebook-sdk 并借助 curl Facebook API 创建广告。 我已经使用 curl 上传了我的视频,它返回了一个 ID。现在,该视频 ID 将用于添加广告,
首先,这是一个编程问题,因为我正在尝试设置与生产服务器一起运行的测试/QA 服务器。 其次,是的,我应该将其发布在 Serverfault 上,但我尝试使用三个不同的 OpenID 提供程序登录,每次
我是一名优秀的程序员,十分优秀!