Используйте модуль подпроцесса Python 2.6 в Python 2.5

Я обнаружил, что проблема в том, как я приводил результаты запроса. Приведение его к типу [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()
10
задан rypel 22 May 2013 в 15:43
поделиться

6 ответов

Я знаю, что на этот вопрос уже ответили, но если это имеет значение, я использовал subprocess.py это поставлется с Python 2.6 в Python 2.3, и он хорошо работал. При чтении комментариев наверху файла, он говорит:

# This module should remain compatible with Python 2.2, see PEP 291.

9
ответ дан 3 December 2019 в 19:35
поделиться

В то время как это непосредственно не отвечает на Ваш вопрос, это может стоить знать.

Импорт от __future__ на самом деле только измените параметры компилятора, поэтому в то время как это может повернуться с в оператор или заставить строковые литералы произвести unicodes вместо strs, это не может изменить возможности и функции модулей в библиотеке стандарта Python.

2
ответ дан 3 December 2019 в 19:35
поделиться

Нет действительно отличного способа сделать это. подпроцесс реализован в 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 код, а не весь модуль.

6
ответ дан 3 December 2019 в 19:35
поделиться

Вот некоторые способы закончить процессы в 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)
1
ответ дан 3 December 2019 в 19:35
поделиться

Хорошо Python является открытым исходным кодом, Вы свободны взять это функция pthread от 2,6 и переместить ее в Ваш собственный код или использовать ее в качестве ссылки на реализацию Ваше собственное.

По причинам, которые должны быть очевидными, нет никакого способа иметь гибрид Python, который может импортировать части более новых версий.

0
ответ дан 3 December 2019 в 19:35
поделиться

Я последовал предложению Камила Кисиэля относительно использования 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
2
ответ дан 3 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

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