将“pyc”导入现有python脚本

2024-04-26 18:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图添加一个目录,在那里我可以抛出一些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是一种非常棒的语言,我不敢相信你不能从一个脚本中找到一个脚本并让它工作。 请告知。在


Tags: 文件namefrompyimport脚本名称mod
3条回答
  • 您可以在exec调用中使用一个(Python中很少见的)分号,使您拥有的两个exec中的一个
  • 您可能想看看importlib中的import_module(name, package)

如果要在已导入的模块中自动执行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样式?不要。在python中,您希望使用“import”来初始化模块并使其可用,并且可以在多个位置多次导入同一个模块。您希望不使用*来执行此操作,因此可以按可预测的顺序进行操作:这是很好的python,但是使用*imports是不可能的:

^{pr2}$

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

 def example(*args):
     print args

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

只要在创建按钮时定义了example,就可以在没有任何全局名称空间修改的情况下工作。使用类来管理这一点是很常见的,这样回调就可以转到类函数:这使得管理正在发生的事情变得非常容易。在

顺便说一句,如果您需要将参数传递给gui调用,那么最便宜的方法是使用functools.partial,它是为绑定参数和可调用项而设计的,仅此而已:

from functools import partial
import my_module 

# somewhere in gui

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

Tech-Artists.org有一个关于这个问题的bunch of discussion

AFAIKexec有自己的变量范围,因此将脚本导入一个立即被销毁的范围。您可以传递全局变量和局部变量的dicts,也可以完全避免{},这是我的建议。为什么不直接使用from ... import *?在

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

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

    import sys
    sys.path.append("/path/to/directory")
    

相关问题 更多 >