Как развернуть приложение Python с библиотеками как источник без дальнейших зависимостей?

В результате наших комментариев давайте вместе с делегированием посмотрим, сможем ли мы решить вашу проблему:

Объявив протокол, вы можете сделать это в другом файле или в своем ViewController:

Этот протокол имеет метод для извлечения данных снова после добавления данных в FormulaViewController

protocol DataFetcherDelegate {
    func fetchData()
}


class ViewController: UIViewController {

. Затем выполните этот протокол из ваших ViewController:

class ViewController: UIViewController, DataFetcherDelegate {

После вы соответствуете протоколу, вам нужно будет реализовать метод fetchData внутри ViewController, именно здесь вы будете помещать запрос на выборку основных данных для получения обновленных данных:

func fetchData() {
    print("fetchingData")
    // write your data fetching code here, then make your arrays equal respectively again.
    // once fetching and assigning data to arrays are complete do:
    tableView.reloadData()
}

Теперь перейдите к FormulaViewController и добавьте переменную delegate следующим образом:

class FormulaViewController: UIViewController {
    var delegate: DataFetcherDelegate?

Затем вернитесь к ViewController, где бы вы ни создавали свой экземпляр FormulaViewController (я получил код ниже из вашего комментария, вам также нужно отлить VC как FormulaViewController, он немного обновлен, не используйте ваш старый код) и назначить ViewController как delegate из FormulaViewController:

let vc = storyboard!.instantiateViewController(withIdentifier: "formulaView") as! FormulaViewController
vc.delegate = self // assigning self as delegate of FormulaVC
self.present(vc, animated: true, completion: nil)

Теперь мы закончили с частью ViewController, теперь мы перейдем к FormulaViewController и сделаем следующее:

Перед тем, как вы отклоните свой поп upView после успешного сохранения новых данных, теперь мы скажем нашему delegate (ViewController) снова извлечь данные ядра, затем мы отклоним FormulaViewController:

//save your respective item to your core data, formula, time or step

// then for the sake of example, lets add a Formula:

let newFormula = Formula(/*with your core data context*/)
//save to your core data with context. like persistentContainer.viewContext.save(), I dont know how you implemented that.
delegate?.fetchData()
dismiss(animated: true, completion: nil)

Теперь, надеюсь, однажды FormulaViewController удаляется, данные ViewController также будут обновлены.

13
задан Boris Terzic 9 February 2009 в 16:15
поделиться

5 ответов

Я иногда использую подход, который я описываю ниже по той же самой причине, что @Boris указывает: Я предпочел бы, чтобы использование некоторого кода было так же легко, как a) svn контроль/обновление - b) идут.

Но для записи:

  • Я использую virtualenv/easy_install большую часть времени.
  • Я соглашаюсь до некоторой степени на критические замечания @Ali A и @S.Lott

Так или иначе подход, который я использую, зависит от изменения sys.path и работает как это:

  • Потребуйте Python и setuptools (чтобы позволить загрузить код из яиц) на всех компьютерах, которые будут использовать Ваше программное обеспечение.
  • Организуйте свою структуру каталогов это:
project/
    *.py
    scriptcustomize.py
    file.pth

    thirdparty/
        eggs/
            mako-vNNN.egg
            ... .egg
        code/
            elementtree\
                *.py
            ...
  • В Вашем сценарии (сценариях) верхнего уровня включают следующий код наверху:
from scriptcustomize import apply_pth_files
apply_pth_files(__file__)
  • Добавьте scriptcustomize.py к своей папке проекта:
import os
from glob import glob
import fileinput
import sys

def apply_pth_files(scriptfilename, at_beginning=False):
    """At the top of your script:
    from scriptcustomize import apply_pth_files
    apply_pth_files(__file__)

    """
    directory = os.path.dirname(scriptfilename)
    files = glob(os.path.join(directory, '*.pth'))
    if not files:
        return
    for line in fileinput.input(files):
        line = line.strip()
        if line and line[0] != '#':
            path = os.path.join(directory, line)
            if at_beginning:
                sys.path.insert(0, path)
            else:
                sys.path.append(path)
  • Добавьте один или несколько *.pth файл (файлы) к Вашей папке проекта. На каждой строке, помещенной ссылка на каталог с пакетами. Например:
# contents of *.pth file
thirdparty/code
thirdparty/eggs/mako-vNNN.egg
  • Мне "отчасти" нравится этот подход. Что я люблю: это подобно тому, как *.pth файлы работают, но для отдельных программ вместо Ваших всех пакетов сайта. Что я не люблю: необходимость добавить эти две строки в начале сценариев верхнего уровня.
  • Снова: Я использую virtualenv большую часть времени. Но я склонен использовать virtualenv для проектов, где я имею жесткий контроль над сценарием развертывания. В случаях, где я не имею жесткого контроля, я склонен использовать подход, который я описываю выше. Это делает действительно легким упаковать проект как zip и иметь конечного пользователя, "устанавливают" его (путем разархивации).
8
ответ дан 1 December 2019 в 21:38
поделиться

Просто используйте virtualenv - это - инструмент для создания изолированных сред Python. Можно создать сценарий установки и распределить целый набор, если Вы хотите.

9
ответ дан 1 December 2019 в 21:38
поделиться

"Мне не нравится то, что разработчики (или меня запускающийся на чистой новой машине) должны перейти через distutils обручи необходимости установить библиотеки локально, прежде чем они смогут начать"

Почему?

Что - конкретно - является неправильным с этим?

Вы сделали это для создания проекта. Ваш проект является настолько популярными другими, хотят сделать то же.

Я не вижу проблемы. Обновите свой вопрос с определенными проблемами, в которых Вы нуждаетесь решенный. Неприязнь способа, которым распределяется открытый исходный код, не является проблемой - это - способ, которым работает открытый исходный код.

Править. "Окруженный стеной сад" не имеет значения очень.

Выбор 1. Вы могли, BTW, создать "установщик", который выполняет easy_install 6 раз для них.

Выбор 2. Можно сохранить все наборы установщика, которые использовал бы easy_install. Затем можно предоставить сценарий, который делает разархивировать и a python setup.py install для всех шести.

Выбор 3. Можно обеспечить заархивированную версию Вашего site-packages. После того, как они установят Python, они разархивировали Ваш каталог пакетов сайта в 'C:\Python2.5\lib\site-packages''.

Выбор 4. Можно создать собственный набор установщика MSI для среды Python.

Выбор 5. Можно разместить собственный подобный pypi сервер и обеспечить easy_install, который проверяет сервер сначала.

8
ответ дан 1 December 2019 в 21:38
поделиться

Я соглашаюсь с ответами Nosklo и S.Lott. (+1 обоим)

Могу я просто добавить, что то, что Вы хотите сделать, является на самом деле ужасной идеей.

Если Вы действительно захотите, чтобы люди взломали на Вашем коде, то им будет нужно некоторое понимание вовлеченных библиотек, как они работают, каковы они, куда они происходят из, документация для каждого и т.д. Уверенный предоставляют им сценарий начальной загрузки, но кроме того Вы будете трястись до такой степени, что они невежественны.

Затем существуют конкретные вопросы такой как "что, если один пользователь хочет установить другую версию или реализацию библиотеки?", явным примером здесь является ElementTree, поскольку это имеет много реализаций.

0
ответ дан 1 December 2019 в 21:38
поделиться

Я не предполагаю, что это - прекрасная идея, но обычно что я делаю в ситуациях как они, то, что у меня есть Make-файл, зарегистрировался в подверсии, которая содержит, делают правила выбрать все зависимые библиотеки и установить их. Make-файл может быть достаточно умным, чтобы только применить зависимые библиотеки, если они не присутствуют, таким образом, это может быть относительно быстро.

Новый разработчик на проекте просто проверяет из подверсии и затем вводит, "делают".

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

0
ответ дан 1 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

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