【问题标题】:Ableton Python __init__ self file flushAbleton Python __init__ 自文件刷新
【发布时间】:2018-09-29 08:09:02
【问题描述】:

我正在编写一个ableton python 脚本。这个将字符串写入文件:

class LaunchControl(ControlSurface):    

    def __init__(self, c_instance):
        super(LaunchControl, self).__init__(c_instance)

        f = open("d:\members2.txt", "w")
        f.write('START ok\n\n')
        f.flush()

但是这个没有,我在日志中看不到任何错误。唯一的区别是最后一行:

class LaunchControl(ControlSurface):    

    def __init__(self, c_instance):
        super(LaunchControl, self).__init__(c_instance)

        f = open("d:\members2.txt", "w")
        f.write('START ok\n\n')
        f.flush()
        self.f = f

我想在 LaunchControl 类的其他函数中使用 f

【问题讨论】:

  • 但如果我执行 f.close() 就可以了!
  • 评论是供其他人要求澄清等。如果您想为您的问题添加其他信息,请始终通过点击edit 按钮添加它。如果您因为有人要求而添加某些内容,请将其添加到问题中,然后留下包含@+用户名的评论,以确保该人得到通知
  • 你打算用f做什么?它只是日志输出吗?
  • 谢谢大家。我是 python 新手,所以会出现愚蠢的问题。只是想知道为什么冲洗不起作用

标签: python ableton-live


【解决方案1】:

打开文件是一个坏习惯。如果其他应用程序需要读取或写入同一个文件会怎样?由于您已以写入模式打开它,因此它被阻止,并且在关闭(释放)之前没有其他应用程序可以访问它。

如果你想从多个函数或脚本访问你的文件,保存它的文件名:

self.filename = "d:\members2.txt"

当你需要时,你打开(然后关闭)它。


建议不要使用f = open(...)。使用安全关键字with。

with open("d:\members2.txt", 'w') as f:
    f.write('...')

退出 with 范围后,资源(在本例中为文件流)会自动关闭和释放。即使在抛出异常的情况下,它也是安全关闭的。 python文档说(强调):

with 语句允许围绕代码块执行初始化和终结代码

此外,您不需要显式刷新文件。退出with块后,文件自动关闭并刷新

【讨论】:

  • OP 不希望文件关闭,他希望文件保持打开状态,但仍能立即获得文件 IO
【解决方案2】:

关注docs(在os.fsync上):

如果您从 Python 文件对象 f 开始,请先执行 f.flush(),然后做os.fsync(f.fileno()),确保所有 与 f 关联的内部缓冲区被写入磁盘。

所以你应该这样做

class LaunchControl(ControlSurface):    

    def __init__(self, c_instance):
        super(LaunchControl, self).__init__(c_instance)

        f = open("d:\members2.txt", "w")
        f.write('START ok\n\n')
        f.flush()
        os.fsync(f.fileno())
        self.f = f

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2015-03-05
    • 2017-04-18
    • 2011-04-30
    • 2011-03-11
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    相关资源
    最近更新 更多