Может ли python отправлять текст в буфер обмена Mac

Добавление поддержки CLR к вашему C ++-приложению только для того, чтобы получить класс Mutex чрезмерно. Существует несколько вариантов синхронизации вашего доступа к файлам между двумя приложениями.

Вариант 1: Mutex

Если вам нужно записать файл из нескольких процессов, использование мьютекса - это хороший способ сделать это. Используйте функции mutex в Win32 API. (Класс .Net Mutex - это всего лишь оболочка вокруг этих функций.)

HANDLE mutex = CreateMutex(NULL, false, "MyMutex");

DWORD waitResult = WaitForSingleObject(mutex, INFINITE);
if (waitResult == WAIT_OBJECT_0)
{
    // TODO: Write the file
    WriteFile(...);

    ReleaseMutex(mutex);
}

Как уже отмечалось в другом ответе, вам нужно будет открыть файл с общим доступом, чтобы обе ваши приложения могли открывать это сразу. Однако этого может быть недостаточно: если оба ваших приложения пытаются записать в одну и ту же область файла, вам все равно нужно будет убедиться, что одновременно записывается только одно приложение. Представьте, что если оба приложения смотрят на размер файла, то оба попытаются одновременно записать на это смещение байта: даже если оба пытались просто добавить к концу файла, они оказались сбиты друг с другом.

Вариант 2: Открыть только как добавление

Если вы чисто записываете в конец файла и никогда не пытаетесь ничего прочитать или писать где-нибудь, кроме самого конца файла , то есть специальный режим, который вы можете использовать, что позволит вам не использовать мьютекс. Если вы откроете файл с dwDesiredAccess, установленным на FILE_APPEND_DATA | SYNCHRONIZE, и больше ничего (не включите FILE_WRITE_DATA), тогда ОС позаботится о том, чтобы все данные, которые были записаны в файл в конце, и два приложения, записывающие данные, не перезаписывают друг друга. Это поведение задокументировано на MSDN :

Если установлены только флаги FILE_APPEND_DATA и SYNCHRONIZE, вызывающий может писать только в конец файла и любую информацию о смещении о записи в файл игнорируется.

blockquote>

Опция 3: LockFile

Еще один путь, который вы можете предпринять, - использовать LockFile. С помощью LockFile (или LockFileEx ) вы можете открыть оба файла для обоих приложений и заблокировать каждый файл раздела файла, который он хочет записать, , Это дает вам более гранулярность, чем мьютекс, позволяя одновременно выполнять неперекрывающиеся записи. (Использование LockFile для всего файла даст вам тот же базовый эффект, что и мьютекс, с дополнительным преимуществом, которое предотвратит использование другими приложениями файла при этом.) Есть хороший пример того, как использовать LockFile на блоге Раймонда Чена .

29
задан David Sykes 1 December 2009 в 11:51
поделиться

6 ответов

Новый ответ:

На этой странице предлагается:

Реализация для всех версий Mac OS X

Другой модуль Mac (MacSharedClipboard.py в листинге 4) реализует интерфейс буфера обмена поверх двух программ командной строки, называемых pbcopy (который копирует текст в буфер обмена) и pbpaste (который вставляет любой текст буфер обмена). Приставка «pb» означает «монтажная доска», термин Mac для обозначения буфера обмена.

Старый ответ:

Очевидно так:

http://code.activestate.com/recipes/410615/

- это простой скрипт, демонстрирующий, как это сделать.

Редактировать: только что понял, что это зависит от углерода, поэтому не может быть идеальным ... зависит от того, для чего вы его используете.

7
ответ дан mavnn 1 December 2009 в 11:51
поделиться

Как записать строку Unicode в буфер обмена Mac:

import subprocess

def write_to_clipboard(output):
    process = subprocess.Popen(
        'pbcopy', env={'LANG': 'en_US.UTF-8'}, stdin=subprocess.PIPE)
    process.communicate(output.encode('utf-8'))

Как прочитать строку Unicode из буфера обмена Mac:

import subprocess

def read_from_clipboard():
    return subprocess.check_output(
        'pbpaste', env={'LANG': 'en_US.UTF-8'}).decode('utf-8')

Работает как на Python 2.7, так и на Python 3.4.

63
ответ дан David Foster 1 December 2009 в 11:51
поделиться

Я знаю, что это старая статья, но я нашел очень элегантное решение этой проблемы.

Существует библиотека с именем PyClip , которую можно найти на https://github.com/georgefs/pyclip-copycat .

Синтаксис довольно прост (пример из репозитория Github):

import clipboard

# copy some text to the clipboard
clipboard.copy('blah blah blah')

# get the text currently held in the clipboard
text = clipboard.paste()

после прохождения clipboard.copy('foo') вы можете просто cmd + v получить текст

5
ответ дан AtomicBen 1 December 2009 в 11:51
поделиться

Простой способ:

cmd = 'echo %s | tr -d "\n" | pbcopy' % str
os.system(cmd)

Кроссплатформенный способ:
https://stackoverflow.com/a/4203897/805627

from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.destroy()
14
ответ дан Community 1 December 2009 в 11:51
поделиться

В следующем коде используется PyObjC ( http://pyobjc.sourceforge.net/ )

from AppKit import NSPasteboard, NSArray

pb = NSPasteboard.generalPasteboard()
pb.clearContents()
a = NSArray.arrayWithObject_("hello world")
pb.writeObjects_(a)

Как описано в в документации по какао , для копирования требуется три шаг:

  • получить монтажный картон
  • очистить его
  • заполнить его

Заполнить монтажный щит массивом объектов (здесь a содержит только одну строку).

15
ответ дан FabienAndre 1 December 2009 в 11:51
поделиться

Если вы просто хотите поместить текст в буфер обмена Mac, вы можете использовать команду оболочки pbcopy.

1
ответ дан jellyfishtree 1 December 2009 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: