Импорт переменных python из программы после ее выполнения - PullRequest
0 голосов
/ 17 августа 2010

Я написал два скрипта на python: script1.py и script2.py. Я хочу запустить script1.py из script2.py и получить содержимое переменных script1, созданных во время выполнения script1. Script1 имеет несколько функций, в которых создаются переменные, в том числе и в основном.

Спасибо за все ваши ответы. Я проверил ваши ответы, и это не похоже на работу. Вот виновные сценарии, о которых я говорю:

script1.py

def main(argv):
    """Main of script 1
    Due to the  internal structure of the script this 
    main function must always be called with the flag -d
    and a corresponding argument.
    """
    global now
    now = datetime.datetime.now()

    global vroot_directory
    vroot_directory = commands.getoutput("pwd")

    global testcase_list_file
    testcase_list_file = 'no_argument'

    try:
        opts, args = getopt.getopt(argv, "d:t:", 
            ["directory_path=", "testcase_list="])
    except getopt.GetoptError, err:
        print command_syntax
        sys.exit()
    for opt, arg in opts:
        if opt in ("-d", "--directory"):
            vroot_directory = arg
        if opt in ("-t", "--testcase"):
             testcase_list_file = arg

    def function1():
        pass  

    def function2():
        if testcase_list_file == 'no_argument':
            function1()
        else:
            function2()

if __name__ == "__main__":
    main(sys.argv[1:]) 

script2.py

from Tkinter import *

class Application:
    def __init__(self):
        """ main window constructor """
        self.root = Tk()
        # I'd like to import here the variables of script1.py
        self.root.title(script1.vroot_directory)   ?
        self.root.mainloop()

# Main program
f = Application()

Извините за мои ошибки и спасибо за ваши соответствующие замечания. У меня следующее сообщение об ошибке:

"AttributeError: объект 'module' не имеет атрибута 'vroot_directory'"

Чтобы быть более конкретным, я хотел бы иметь что-то похожее на следующее:

from Tkinter import *
import script1

class Application:
    def __init__(self):
        """ main window constructor """
        self.root = Tk()
        script1.main(-d directory -t testcase_list_file) # to launch script1
        self.root.title(script1.vroot_directory)   # and after use its variables and functions
        self.root.mainloop()

# Main program
f = Application()

Ответы [ 5 ]

4 голосов
/ 17 августа 2010

С script2 do

import script1

Это запустит любой код внутри script1;любые глобальные переменные будут доступны, например, script1.result_of_calculation.Вы можете установить глобальные переменные, как показано ниже.


script1:

from time import sleep
def main( ):
    global result
    sleep( 1 ) # Big calculation here
    result = 3

script2:

import script1
script1.main( ) # ...
script1.result # 3

Обратите внимание, что это будет приятнее сделать main() в script1, вернуть result, чтобы вы могли сделать

import script1
result = script1.main( )

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

0 голосов
/ 17 августа 2010

Я думаю, что вы ищете какую-то форму постоянства объекта. Я лично использую модуль полки для этого:

Сценарий 1:

import shelve

def main(argv):
    """Main of script 1
    Due to the  internal structure of the script this 
    main function must always be called with the flag -d
    and a corresponding argument.
    """

    settings = shelve.open('mySettings')

    global now
    now = datetime.datetime.now()

    settings['vroot_directory'] = commands.getoutput("pwd")

    settings['testcase_list_file'] = 'no_argument'

    try:
        opts, args = getopt.getopt(argv, "d:t:", 
            ["directory_path=", "testcase_list="])
    except getopt.GetoptError, err:
        print command_syntax
        sys.exit()
    for opt, arg in opts:
        if opt in ("-d", "--directory"):
            settings['vroot_directory'] = arg
        if opt in ("-t", "--testcase"):
            settings['testcase_list_file'] = arg

    def function1():
        pass  

    def function2():
        if testcase_list_file == 'no_argument':
            function1()
        else:
            function2()

if __name__ == "__main__":
    main(sys.argv[1:]) 

Сценарий 2:

from Tkinter import *
import shelve

class Application:
    def __init__(self):
        settings = shelve.open('mySettings')

        """ main window constructor """
        self.root = Tk()
        # I'd like to import here the variables of script1.py
        self.root.title(settings['vroot_directory'])   ?
        self.root.mainloop()

# Main program
f = Application()

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

0 голосов
/ 17 августа 2010

Python является интерпретируемым языком, поэтому, когда вы просто импортируете скрипт в другой скрипт (например, записав import script1 в script2), интерпретатор загрузит второй скрипт и выполнит его шаг за шагом.Каждое определение функции приведет к вызываемому объекту функции и т. Д., И каждое выражение будет просто выполнено.

После этого вы можете получить доступ ко всему из модуля с помощью script1.globalvar1 и т. Д.

0 голосов
/ 17 августа 2010

Есть две возможности: во-первых, объединить их в один скрипт.Это может выглядеть примерно так (в script2.py)

import script1

...
script1.dostuff()
importantvar = script1.importantvar
doScript2Stuff(importantvar)

Однако, не зная вашего приложения, я бы посоветовал инкапсулировать все, что script1 делает в функцию, так что вы можете просто вызвать

(var1, var2, var3) = script1.dostuffAndReturnVariables()

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

Вторая возможность, если по какой-то причине их нужно запускать отдельно, этоиспользуйте pickle.

Запишите

output = open(picklefile, "w")
pickle.dump(vars, output)    
output.close()

в script1.py

, а затем

inputfile = open(picklefile, "r")
vars = pickle.load(inputfile)
input.close()

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

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

0 голосов
/ 17 августа 2010

В зависимости от того, сколько переменных вы хотите передать в script2.py, вы можете передать их через аргументы и выбрать их как массив argv. Затем вы можете запустить script1.py из этого сценария и запустить os.system ('script2.py arg0 arg1 arg2 arg3') для вызова script2.py.

Затем вы можете выбрать переменные в вашем script2.py, выполнив следующее:

import sys

arg0 = sys.argv[0]
arg1 = sys.argv[1]
...
...