Ableton Python __init__ self file flush - PullRequest
       38

Ableton Python __init__ self file flush

0 голосов
/ 29 сентября 2018

Я пишу скрипт на 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

Я хочу использовать f в других функциях класса LaunchControl

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

После документов (на 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
0 голосов
/ 29 сентября 2018

Оставлять файл открытым - вредная привычка.Что происходит, если другие приложения должны читать или записывать в тот же файл?Поскольку вы открыли его в режиме записи, он заблокирован, и никакое другое приложение не сможет получить к нему доступ, пока он не будет закрыт (выпущен).

Если вы хотите получить доступ к файлу из нескольких функций или сценариев, сохраните его имя файла:

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

и, когда вам нужно, вы открываете (а затем закрываете) его.


В качестве рекомендации не используйте f = open(...).Используйте ключевое слово safe with.

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

После выхода из области действия с ресурсом (в данном случае файловым потоком) автоматически закрывается и освобождается.Это безопасность закрыта даже в случае исключений.Документация Python гласит (выделение добавлено): оператор

with позволяет выполнять инициализацию и финализацию кода вокруг блока кода

Более того, вам не нужно явно сбрасывать файл.После выхода из блока with файл автоматически закрывается и сбрасывается

...