Функция запуска Python, ожидание, завершение функции, запуск следующей функции - PullRequest
0 голосов
/ 10 мая 2019

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

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

Что я пробовал до сих пор:

import AAPL
import GOOG
import sys
import sleep

AAPL.main()
time.sleep(10)
sys.exit(AAPL)
GOOG.main()


И несколько различных вариантов с такими функциями, как

terminate, kill()

странная вещь в том, что, когда я пробую первую строку кода, которой я поделился, но заменяю

AAPL.main() & GOOG.main()

с

print("Running") & print("terminate")

В результате я получаю "terminte", что не относится к GOOG.main ()

Может ли кто-нибудь помочь мне с этим вопросом?

EDIT: Код AAPL.py, такой же, как GOOG.py:

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
import sys

def print_to_file(*args):
    with open('AAPL.txt', 'a') as fh:
        fh.write(' '.join(map(str,args)))
        fh.write('\n')
print = print_to_file


class TestApp(EWrapper, EClient):
    def __init__(self):
        EClient.__init__(self, self)


    Layout = "{!s:1} {!s:2} {!s:3} {!s:4} {!s:5} {!s:6} {!s:7} {!s:8} {!s:8} '\n'"
    print(Layout.format("Ticker;", "Date;", "None;", "Time;", "Open;", "High;", "Low;", "Close;", "Volume"))


    def historicalData(self, reqId, bar):
        print("AAPL", ";", bar.date.replace(' ', '; '), ";", bar.open, ";", bar.high, ";", bar.low, ";", bar.close, ";", bar.volume)


def main():
    app = TestApp()

    app.connect("127.0.0.1", 7497, 0)

    contract = Contract ()
    contract.symbol = "AAPL"
    contract.secType = "STK"
    contract.exchange = "SMART"
    contract.currency = "USD"
    contract.primaryExchange = "NASDAQ"

    app.reqHistoricalData(0, contract, "20180201 10:00:00", "1 D", "1 min", "TRADES", 0, 1, False, [])

    app.run()

if __name__ == "__main__":
    main()

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

Ответы [ 2 ]

1 голос
/ 10 мая 2019

попробуйте это:

from multiprocessing import Process
import AAPL
import GOOG

if __name__ == "__main__":
    print("run AAPL")
    proc1 = Process(target = AAPL.main())
    proc1.start()
    print("run GOOG")
    proc2 = Process(target = GOOG.main())
    proc2.start()
0 голосов
/ 10 мая 2019

Этого должно быть достаточно.

import AAPL
import GOOG

AAPL.main()
time.sleep(10) # not mandatory, could be eliminated
GOOG.main()

sys.exit завершит выполнение текущего питона, что не позволит GOOG.main() выполнить.

...