将“pyc”导入现有的python脚本

时间:2014-01-19 10:29:03

标签: python import module namespaces maya

我正在尝试添加一个目录,我可以在其中抛出一些pyc文件并从我的脚本中调用它们。

基本上它是一个独立的python脚本,里面有一堆def, 我希望pyc文件的名称是执行的命令。 到目前为止这个工作正常,除了一件事,我的GUI按钮正在调用defs 由于名称空间错误,python无法识别它们。

如何从脚本中导入它,就像导入它一样:

  

从模块导入为*

我正在运行此代码以将其加载到:

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)

我知道我可以写:module.somefunction(),但那不是我需要的...... 我需要“模块”独立工作..

请帮助,这让我发疯,python是一种非常棒的语言,我不能相信你不能从脚本中获取脚本并让它工作。 请指教。

3 个答案:

答案 0 :(得分:1)

  • 您可以在exec调用中使用(稀有的Python)分号,从而使{2}中的一个exec
  • 您可能需要查看importlib
  • 中的import_module(name, package)

答案 1 :(得分:0)

AFAIK exec拥有自己的变量范围,从而将您的脚本导入到立即销毁的范围内。你可以为全局和本地传递dicts或完全避免exec,这将是我的建议。你为什么不直接使用from ... import *

如果您在目录中放置__init__.py文件,则可以使用from folder.script import *,如果该文件夹不在当前工作目录或路径中,则

  1. 可能做错了,你的代码应该有一个项目目录(当然可以有子目录);或创建多个单独安装的模块,并确保您需要的模块在您的路径中
  2. 可以在路径中添加任何目录,因此您可以使用

    直接从中导入模块
    import sys
    sys.path.append("/path/to/directory")
    

答案 2 :(得分:0)

如果您想在已导入的模块中自动执行def,可以使用inspect module更简单地执行此操作:

import inspect
def auto_exec (module):
    for fn_name, fn in inspect.getmembers(module, isfunction):
        if fn_name == module.__name__:  fn()

然而,对于真正的问题,这是一个绑定。

将事物弹出到全局命名空间是对问题的邀请,因为现在可以确定您从全局空间调用的名为X的函数是您想要的X - 许多不同的模块使用类似的函数名称和没有命名空间你不能确定你得到你想要的。这就像自愿拥抱Javascript风格的全局错误。

听起来你正在用字符串调用mel-style脚本?别。在python中,你想使用'import'来初始化模块并使它们可用,并且可以在多个地方多次导入同一个模块。你想在没有*的情况下做到这一点,所以你可以保持可预测的顺序:这是很好的python但是*导入是不可能的:

 import legs
 import arms

 legs.rig(cmds.ls("*leg"))
 arms.rig(cmds.ls("*arm"))

至于在GUI中调用函数,只有在尝试使用字符串调用函数时,全局命名空间才有意义。直接将python函数作为函数传递:

 def example(*args):
     print args

 b = cmds.button("test", c= example) # this could also be "somemodule.example" if you import somemodule

只要在创建按钮时定义了示例,就可以在没有任何全局命名空间的情况下进行操作。使用类来管理它是很常见的,这样回调就会转到类函数:这样可以很容易地管理正在发生的事情。

顺便说一句,如果你需要将参数传递给gui调用,那么这样做的便宜方法就是使用functools.partial来设计用于捆绑args和calla的方式:

from functools import partial
import my_module 

# somewhere in gui

my_button = cmds.button ("test", c = partial(my_module.my_function, "this works"))

bunch of discussion

上有Tech-Artists.org个问题