- 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!