我试图添加一个目录,在那里我可以抛出一些pyc文件并从脚本中调用它们。在
基本上它是一个独立的python脚本,里面有很多def, 我希望pyc文件的名称是执行的命令。 到目前为止,这一切正常,除了一件事,我的GUI按钮正在调用def python无法识别它们,因为名称空间是错误的。在
如何从脚本中导入它,就像它是导入的一样:
from Module import as *
我运行这个代码来加载它:
def importModule(ModPath):
fullModName= ModPath.split('\\')[-1]
commandtorun=fullModName.split('.')[0]
mod_name,file_ext = os.path.splitext(os.path.split(ModPath)[-1])
if file_ext.lower() == '.py':
py_mod = imp.load_source(mod_name, ModPath)
elif file_ext.lower() == '.pyc':
py_mod = imp.load_compiled(mod_name, ModPath)
exec "from %s import *"%(commandtorun)
exec "%s()" % (commandtorun)
我知道我可以写:模块.somefunction(),但那不是我需要的。。。 我需要“模块”独立工作。。在
请帮忙,这让我发疯了,python是一种非常棒的语言,我不敢相信你不能从一个脚本中找到一个脚本并让它工作。 请告知。在
exec
调用中使用一个(Python中很少见的)分号,使您拥有的两个exec
中的一个import_module(name, package)
如果要在已导入的模块中自动执行def,可以使用inspect module更简单地执行:
然而,这是一个真正的问题。
在全局命名空间中弹出内容是一种问题的邀请,因为现在有一种方法可以确保您从全局空间调用的名为X的函数是您想要的X—许多不同的模块使用相似的函数名,如果没有名称空间,您就无法确定自己得到了想要的结果。这就像是自愿接受Javascript风格的全局错误。在
听起来好像你在用字符串调用脚本mel样式?不要。在python中,您希望使用“import”来初始化模块并使其可用,并且可以在多个位置多次导入同一个模块。您希望不使用*来执行此操作,因此可以按可预测的顺序进行操作:这是很好的python,但是使用*imports是不可能的:
^{pr2}$至于在GUI中调用函数,全局命名空间只在尝试用字符串调用函数时才重要。将python函数作为函数直接传入:
只要在创建按钮时定义了example,就可以在没有任何全局名称空间修改的情况下工作。使用类来管理这一点是很常见的,这样回调就可以转到类函数:这使得管理正在发生的事情变得非常容易。在
顺便说一句,如果您需要将参数传递给gui调用,那么最便宜的方法是使用functools.partial,它是为绑定参数和可调用项而设计的,仅此而已:
在Tech-Artists.org有一个关于这个问题的bunch of discussion
AFAIK},这是我的建议。为什么不直接使用
exec
有自己的变量范围,因此将脚本导入一个立即被销毁的范围。您可以传递全局变量和局部变量的dicts,也可以完全避免{from ... import *
?在如果在目录中放置
__init__.py
文件,则可以使用from folder.script import *
,如果该文件夹不在当前工作目录或路径中,则可以将任何目录添加到您的路径中,因此您可以使用
相关问题 更多 >
编程相关推荐