Слишком сложно, возьмите pointee с takeRetainedValue()
- который правильно обрабатывает управление памятью - и приведите его к [URL]
if let urls = LSCopyApplicationURLsForBundleIdentifier("com.aa.bb" as CFString, nil)?.takeRetainedValue() as? [URL],
let url = urls.first {
print(url)
}
unsafeBitCast
из (CF)URL
в (CF)String
в любом случае невозможно, чтобы получить путь строки, напишите
print(url.path)
Попытайтесь использовать более позднюю версию протокола рассола с параметром протокола к pickle.dumps()
. Значение по умолчанию 0 и является форматом текста ASCII. Больше, чем 1 (я предлагаю Вас, используют рассол. HIGHEST_PROTOCOL). Форматы 1 и 2 протокола (и 3, но это для py3k), являются двоичными и должно быть больше консерватора пространства.
Решение:
import zlib, cPickle
def zdumps(obj):
return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9)
def zloads(zstr):
return cPickle.loads(zlib.decompress(zstr))
>>> len(zdumps(z))
128
Улучшение ответа vartec, которое кажется немного более эффективным с точки зрения памяти (поскольку оно не помещает все в строку):
def pickle(fname, obj):
import cPickle, gzip
cPickle.dump(obj=obj, file=gzip.open(fname, "wb", compresslevel=3), protocol=2)
def unpickle(fname):
import cPickle, gzip
return cPickle.load(gzip.open(fname, "rb"))
z.dumps()
- это уже пиклированная строка, т.е. ее можно распиклировать с помощью pickle.loads():
>>> z = numpy.zeros(1000, numpy.uint8)
>>> s = z.dumps()
>>> a = pickle.loads(s)
>>> all(a == z)
True