2013-05-31 5 views
0

У меня есть 2 файла data.py и interp.py.Python: Импортирование из работающего экземпляра или альтернативы

data.py:

X = cPickle.load(open("X","r")) 

interpret.py:

from data import X 
query = raw_input("Enter query") 

#do something with query and X 

Объект X, который является очень большим. Я сбросил его с помощью cPickle. interp.py будет вызываться другой программой, и из-за способа импорта в настоящее время каждый раз, когда выполняется интерпретация.py, он загружает data.py, который загружает X, а так как X очень большой, требуется много времени.

Я хочу быть в состоянии сделать что-то вроде этого.

data.py:

from time import sleep 
X = cPickle.load(open("X","r")) 
sleep(10**10) #Sleep for eternity 

, а затем запустить data.py

interpret.py:

from data import X #import from live instance of data.py 
        #don't load X all over again 
query = raw_input("Enter query") 

#do something with query and X 

Как я могу это сделать? Если я не могу импортировать из живого экземпляра, есть ли альтернатива делать то, что я хочу сделать. Я не очень хорошо общаюсь, пожалуйста, скажите мне, какие части вы не понимаете, и я попытаюсь разъяснить дальше.

ответ

1

Из чего я могу сказать, что вы хотите запустить демона. Например, вместо импорта данных из интерпретации данные будут выполняться как автономный демон, который интерпретирует связь с чем-то вроде сокета.

Но на данный момент вы в основном писали базу данных, так почему бы просто не перевести все данные, которые у вас есть, в какую-то базу данных и просто связаться с базой данных?

Редактировать: Проблема в том, что вы хотите, чтобы огромный объект сохранялся между процессами, но он не может работать как эта проблема. Каждый раз, когда вы вызываете intepret, возникает новый процесс, что означает отсутствие доступа к объекту, сгенерированному предыдущим процессом. Вот почему существуют демоны (и базы данных).

+0

Я действительно не хочу добавлять еще один слой, который является базой данных. Но я думаю, вы правы. Можете ли вы предложить способ взаимодействия программ python между собой, т. Е. Активировать функции друг друга во время работы? Я использовал это, передавая через stdin, но это было бы грязно, потому что было бы несколько экземпляров интерпретации.py, я просто хотел, чтобы система обрабатывала многопоточность и не попадала в это, что было бы необходимо, если бы я добавить другую базу данных –

+1

Нет, не совсем в вашем случае использования. Отдельные процессы могут связываться через сокеты, unix-сокеты, именованные каналы и тому подобное.Снова я бы предложил использовать базу данных. Это сделает его намного проще и гораздо менее сложным. (потому что, независимо от того, каким образом вы приближаетесь к нему, то, что вы в основном хотите сделать, это написать базу данных. И есть намного лучшие кодеры, чем вы или я, которые уже написали.) – korylprince

+0

Я думаю, вы правы. Это было для одного из моих проектов, и добавление другого слоя означало бы изменение всех наших предыдущих документов (взгляды на архитектуру, драйверы, требования и т. Д.), Но я думаю, что могу обходным путем. Thanks –

1

Чтобы заставить это работать так, как вам нужно, чтобы ваша программа Python работала, вместо того, чтобы ваша другая программа выполняла interp.py как скрипт каждый раз, когда вам нужно будет настроить его так, чтобы interp.py выполняется один раз и каждый раз, когда ваша программа должна выполнить запрос, она использует существующую программу instance.py.

Вы можете, вероятно, просто сделать что-то подобное для interpret.py:

from data import X 
while True: 
    query = raw_input("Enter query") 

    #do something with query and X 

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

+0

Другая программа, о которой я говорю, это php-файл, который должен был вызвать интерпретацию, который будет реализован моим другом. Можете ли вы предложить другой способ для php-файла и интерпретировать для общения, вместо использования stdin? Спасибо –

+1

Вы могли бы выполнить data.py как демон, как я и предложил, а затем скрипт php напрямую связывается с демоном через сокет (пропуская интерпретацию вместе). – korylprince

Смежные вопросы