Я обнаружил, что проблема в том, как я приводил результаты запроса. Приведение его к типу [String: String] приводит к возвращению, потому что на самом деле результат был [String [String: String]], когда все значения для параметра записи были String, но так как я изменил Время открытия и Время закрытия на Int, чем я должен читать снимок как [String [String: Any]]. Итак, последняя функция:
func filterOpenShops(setCompletion: @escaping (Bool) -> ()) {
// Empty the array for beginning of the search
self.availableShopsArray.removeAll()
var ref = Database.database().reference()
ref.child("Continent").child("Europe").child("Country").child("Italy").child("Region").child("Emilia-Romagna").child("City").child("Bologna").child("Shops").child("Shops Opening Times").queryOrdered(byChild: "Opening Time").queryStarting(atValue: openingTimeQueryStart).queryEnding(atValue: openingTimeQueryEnd).observe(.value) { (snapshot) in
print(snapshot)
if let data = snapshot.value as? [String : [String : Any]] {
for (_, value) in
data {
let shopName = value["Shop Name"] as! String
let active = value["Active"] as! String
if active == "true" {
self.availableShopsArray.append(shopName)
print("Shop_Name is :\(shopName)")
print("self.availableShopsArray is: \(self.availableShopsArray)")
}
}
} else {
print("No Shops")
}
// still asynchronous part
setCompletion(true)
// call next cascade function filterClosedShops only when data retrieving is finished
self.filterClosedShops(setCompletion: self.completionSetter)
print(" 1 Open Shops are \(self.availableShopsArray)")
}
} // end of filterOpenShops()
Я знаю, что на этот вопрос уже ответили, но если это имеет значение, я использовал subprocess.py
это поставлется с Python 2.6 в Python 2.3, и он хорошо работал. При чтении комментариев наверху файла, он говорит:
# This module should remain compatible with Python 2.2, see PEP 291.
В то время как это непосредственно не отвечает на Ваш вопрос, это может стоить знать.
Импорт от __future__
на самом деле только измените параметры компилятора, поэтому в то время как это может повернуться с в оператор или заставить строковые литералы произвести unicodes вместо strs, это не может изменить возможности и функции модулей в библиотеке стандарта Python.
Нет действительно отличного способа сделать это. подпроцесс реализован в Python (в противоположность C), таким образом, Вы могли очевидно скопировать модуль где-нибудь и использовать его (надеющийся, конечно, что он не использует 2,6 совершенств).
С другой стороны, Вы могли просто реализовать то, что подпроцесс утверждает, что сделал и записал функции, которая пересылает SIGTERM *, отклоняют, и называет TerminateProcess в Windows. Следующая реализация была протестирована на Linux и в Победе XP vm, Вам будут нужны расширения Windows Python:
import sys
def terminate(process):
"""
Kills a process, useful on 2.5 where subprocess.Popens don't have a
terminate method.
Used here because we're stuck on 2.5 and don't have Popen.terminate
goodness.
"""
def terminate_win(process):
import win32process
return win32process.TerminateProcess(process._handle, -1)
def terminate_nix(process):
import os
import signal
return os.kill(process.pid, signal.SIGTERM)
terminate_default = terminate_nix
handlers = {
"win32": terminate_win,
"linux2": terminate_nix
}
return handlers.get(sys.platform, terminate_default)(process)
Тем путем только необходимо поддержать terminate
код, а не весь модуль.
Вот некоторые способы закончить процессы в Windows, взятом непосредственно из http://code.activestate.com/recipes/347462/
# Create a process that won't end on its own
import subprocess
process = subprocess.Popen(['python.exe', '-c', 'while 1: pass'])
# Kill the process using pywin32
import win32api
win32api.TerminateProcess(int(process._handle), -1)
# Kill the process using ctypes
import ctypes
ctypes.windll.kernel32.TerminateProcess(int(process._handle), -1)
# Kill the proces using pywin32 and pid
import win32api
PROCESS_TERMINATE = 1
handle = win32api.OpenProcess(PROCESS_TERMINATE, False, process.pid)
win32api.TerminateProcess(handle, -1)
win32api.CloseHandle(handle)
# Kill the proces using ctypes and pid
import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, process.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
Хорошо Python является открытым исходным кодом, Вы свободны взять это функция pthread от 2,6 и переместить ее в Ваш собственный код или использовать ее в качестве ссылки на реализацию Ваше собственное.
По причинам, которые должны быть очевидными, нет никакого способа иметь гибрид Python, который может импортировать части более новых версий.
Я последовал предложению Камила Кисиэля относительно использования python 2.6 subprocess.py в python 2.5, и он работал отлично. Чтобы упростить задачу, я создал пакет distutils, который вы можете easy_install и / или включить в buildout.
Чтобы использовать подпроцесс из python 2.6 в проекте python 2.5:
easy_install taras.python26
в вашем коде
from taras.python26 import subprocess
в buildout
[buildout]
parts = subprocess26
[subprocess26]
recipe = zc.recipe.egg
eggs = taras.python26