Python 2.7将方法从一个脚本传递到另一个脚本

时间:2015-11-11 13:57:21

标签: python pickle

我是Pyhton世界的新手。我实际上在做音乐,我用Ableton打电话给软件 我正在做的是为这个软件编写2个脚本 事实上,它们可以在Ableton GUI中选择。每个脚本都链接到硬件接口。这些脚本的作用是允许我自定义硬件接口控制软件的方式(Ableton)。 我的2脚本没问题且运行良好,但是我希望能够从一个脚本向另一个脚本发送订单(当第二个控制器的按钮按下时允许在第一个控制器上执行操作)。
所以我有2个单独的文件夹和2个脚本(我不能使用一个文件夹,因为Ableton必须独立运行和编译两个脚本)。 我们称之为文件夹A 文件夹B 在这两个文件夹中,我都有 __ init __。py main_code.py文件
main_code.py 文件如下所示:

from __future__ import with_statement 
from _Framework.ControlSurface import ControlSurface 
import Live 
import time

class main_code(ControlSurface):

def __init__(self, c_instance):
    ControlSurface.__init__(self, c_instance) 
    with self.component_guard():          
        self._suppress_send_midi = True  
        self.clip = self.selected_scene.clip_slots[self.selected_track_idx].clip
        self._suppress_send_midi = False


    @property
    def selected_track(self):
        return self.song().view.selected_track

    @property
    def selected_track_idx(self):
        return self.tuple_idx(self.song().tracks, self.song().view.selected_track)           

    @property
    def selected_scene(self):
        return self.song().view.selected_scene

    def tuple_idx(self, tuple, obj):
        for i in xrange(0, len(tuple)):
            if (tuple[i] == obj):
                return i
        return(False)

正如你所看到的,我使用了一些框架(ControlSurface)和ableton API(导入Live)。 我想要做的是将变量self.clip从一个脚本“发送”到另一个脚本,以便它们都具有相同的“值” 对不起我的引用,但我现在不再是一个方法或什么... 我的第一个想法之一就是使用pickle将self.clip置于一个文件中并将其加载到另一个文件中,但是当我这样做时,我在aptton报告崩溃时收到错误:

文件“/Users/versonator/Jenkins/live/Projects/AppWebConnector/Resources/third_party/lib/pickle.py”,第1362行,转储

9250毫秒。 RemoteScriptError:文件“/Users/versonator/Jenkins/live/Projects/AppWebConnector/Resources/third_party/lib/pickle.py”,第224行,转储

9250毫秒。 RemoteScriptError:文件“/Users/versonator/Jenkins/live/Projects/AppWebConnector/Resources/third_party/lib/pickle.py”,第306行,保存

9251毫秒。 RemoteScriptError:RuntimeError 9251毫秒RemoteScriptError :: 9251毫秒RemoteScriptError:未启用“Clip.Clip”实例的Pickling(http://www.boost.org/libs/python/doc/v2/pickle.html) 9251毫秒RemoteScriptError:

实际上我像这样使用泡菜:

        clip = self.clip
        f = open('/Users/Louis/Desktop/test.pickle', 'wb')  
        pickle.dump(clip, f, -1)       
        f.close()  

即使我根本不是程序员,这看起来真是一团糟,我希望有人可以帮助我找到另一种方法来做我想做的事或解决我的泡菜方式!

1 个答案:

答案 0 :(得分:0)

让我们假设您使用Ableton调用脚本B.py,它需要来自脚本A.py的self.clip 在脚本B.py的顶部需要self.clip写:

import sys
sys.path.append('\path\to\script\A\')
# You should now be able to import every class from script A 
# and use its methods and functions. 

e.g:

B.py

from A import main_code

mc = main_code(c_instance) # Don't know what c_instance is or where it comes from, 
                           # but i guess you will :)
mc.selected_track()

......等等

也许您需要在脚本A所在的目录中创建一个名为__init__.py的文件,以使该文件夹成为可由其他脚本导入的python包。

如果您需要来自A.py的self.clip,您可以执行以下操作:

mc = main_code(c_instance)
clip = mc.clip

或者你可以在A.py中创建一个返回self.clip的函数:

A.py

class main__code(ControlSurface):
    def __init__(self, c_instance):
        ControlSurface.__init__(self, c_instance) 
        with self.component_guard():          
            self._suppress_send_midi = True  
            self.clip = self.selected_scene.clip_slots[self.selected_track_idx].clip
            self._suppress_send_midi = False

     ...

    def getClip(self):
        return self.clip

注意: 您需要检查A.py中是否更改了self.clip,如果是,则更新B.py中的剪辑。

希望这有帮助