Python 2.7: импортировать модуль и функцию и назначить переменную новой переменной - PullRequest
0 голосов
/ 26 апреля 2018

Я уже несколько часов борюсь с проблемой в моем проекте на python.

Ситуация следующая:

У меня есть скрипт A.py и скрипт B.py

**Script A.py:**
#in this script the function def main() is running 

def main():

       #some coding in here

       x=str(body)#then i assign the string of the variable body to a new variable x

#some other coding in here

if __name__=='__main__':

        main()

НАПОМИНАНИЕ: это псевдокод, объясняющий мою борьбу (скрипт как автономный модуль работает правильно)!

Теперь у меня есть скрипт B.py (в той же папке)

**Script B.py** #in this script i try to run Script A.py and assign the value of variable x to a new variable in order to do furhter processing with it.

import A

A.main() # When importing the module and excuting its main() function by running B.py I see the values of variable x appearing on my screen

ВОПРОС : Как мне теперь присвоить значение переменной x новой переменной, чтобы я мог выполнить дальнейшую обработку с ней в B.py? Это вообще возможно? Причина после вызова основной функции A.py другие операции не выполняются.

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

Буду очень рад любой помощи.

Заранее большое спасибо

С уважением

Slin


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

A.py - скрипт подписки AMQP (https://www.rabbitmq.com/tutorials/tutorial-one-python.html) (см. Ниже):

import pika



   credentials = pika.PlainCredentials('admin', 'admin')
   connection = pika.BlockingConnection(pika.ConnectionParameters('Ipaddress',
                                          5672,
                                          '/',
                                          credentials))
   #connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
   channel = connection.channel()

   channel.exchange_declare(exchange='logs',
                               exchange_type='fanout')

   result = channel.queue_declare(exclusive=True)
   queue_name = result.method.queue

   channel.queue_bind(exchange='logs',
                         queue=queue_name)

   print(' [*] Waiting for logs. To exit press CTRL+C')

   def callback(ch, method, properties, body):

          x = str(body)
          print str(x)
   channel.basic_consume(callback,
                            queue=queue_name,
                            no_ack=True)



   channel.start_consuming()


if __name__ == '__main__':
       main()

B.py:

import pika
import A
A.main()

С подходами до сих пор я получаю то же самое, что показано с кодировкой выше. Я хотел бы присвоить x (какие значения можно изменить, когда A запущен) новой переменной в B.py, чтобы выполнить некоторую обработку, чтобы впоследствии опубликовать ее с помощью аналогичного сценария A.py.

При выполнении B.py я получаю:

[*] Waiting for logs. To exit press CTRL+C
['20'] #this is the string of variable x from script A

Теперь я хочу присвоить это ['20'] новой переменной с B.py .. но сценарий B.py продолжает выполнять A.main () (что логично, потому что это цикл).

Спасибо за вашу поддержку.

С уважением

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Просто относитесь к этому, как к любому другому модулю. В сценарии A создайте функцию, которую вы назвали main. В нем должна быть переменная, которую вы можете вставить из другого скрипта, назовите ее body.

Сценарий А:

def main(body):
    ...
    return x

Затем вы импортируете другой скрипт, как и любую другую модель, используя import _.py в качестве _. Вы используете функцию так же, как в другом сценарии B. Это как если бы вы импортировали объект A и вызывали его метод b.

Сценарий B:

import a.py as A

object = A.main(thing2string) # or object = A.main() if the script b has something to return

Теперь у вас есть объект, созданный в A, который вы можете обработать в be. Например,

processed = [object[i] for i in object]
# ... processing steps

Я не знаю, сможете ли вы уведомить вас об изменениях. Но вы используете таймер, чтобы проверить, обновлено ли значение, и оператор if, чтобы обновить, если оно имеет значение.

Резюме:

Вы должны добавить строку возврата в сценарий А. И вы должны установить переменную, равную ей в сценарии b. Эта новая переменная становится тем, что возвращает b.

0 голосов
/ 27 апреля 2018

Сделать x глобальной переменной внутри A.py

**Script A.py:**
#in this script the function def main() is running 

x = ''
def main():
   global x
   #some coding in here

   x=str(body)
   #then i assign the string of the variable body to a new variable x

   if __name__=='__main__':
      main()

Теперь вы можете получить доступ к этому x из B.py как A.x

0 голосов
/ 26 апреля 2018

Вы можете вернуть значение x в сценарий B, используя оператор return:

return str(body)#then i assign the string of the variable body to a new variable x

Затем получите это значение в скрипте B, сохранив его в переменной x = A.main().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...