【问题标题】:Python run function, wait, terminate function,run next functionPython运行函数,等待,终止函数,运行下一个函数
【发布时间】:2019-05-10 13:52:19
【问题描述】:

我正在尝试从 IBAPI 下载历史数据,由于我对编码不是那么精通,我想出了一个计划,为每只我想要数据的股票编写单独的文件,并让 1 个主文件运行所有这些文件。 问题是我每次只能请求 1 个股票,所以在第一个完成下载后,我希望主文件运行下一个程序。

过去几天我尝试了多种不同的方法,但由于某种原因 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")

我确实收到“终止”作为结果,而 GOOG.main() 不是这种情况

谁能帮我解决这个问题?

编辑: 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()

单独运行它会给我这只股票所需的结果,但因为它不会在几秒钟后停止该功能,所以当我尝试运行多个时它不起作用

【问题讨论】:

  • 一切都取决于main 函数的样子。如果AAPL.main() 没有自行返回,您将无法在单线程设置中对其进行任何操作。
  • 也许您的 AAPL 和 GOOG 中的主要功能根本不会返回。为我们提供这两个文件的主要代码。或者只使用线程,因为线程可以同时运行。
  • 谢谢你的回答,我会更新我的帖子并添加AAPL文件,和GOOG一样
  • 我已经更新了我的帖子,它现在包含我的代码。我是否必须将我的 main 替换为线程,或者在我想尝试从中运行所有内容的文件中替换?

标签: python python-3.x pycharm interactive-brokers


【解决方案1】:

试试这个:

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()

【讨论】:

  • 不幸的是,这不起作用,它同时创建 2 个新文件(AAPL 和 GOOG),然后运行 ​​AAPL(也说“运行 AAPL”,但它不会杀死“AAPL” en 因此不会启动“GOOG”(也不会说“运行 GOOG”)。即使我添加 sleep(10) 和/或 sys.exit()
  • 我不熟悉 IB API,但经过一些研究。调用 app.run() 将启动一个 loop() ,这意味着它永远不会停止。因此,使用一个进程调用两个文件将无济于事,因为除非您停止正在运行的语句,否则您将无法运行下一条语句。这就是为什么我建议你使用多线程。当然它会创建 2 个文件,因为这两个函数都在运行。并且不需要杀死 AAPL.main() 来启动 GOOG.main(),它们必须一起运行。
  • 关于如何停止 AAPL 或 GOOG,您需要查看 IB API 文档,也许您不需要使用 app.run()(在 AAPI 或 GOOG 文件中)也许它们是做你想做的事的另一种方式,
  • 据我所知。您可以创建一个调用 AAPI 的类并将其作为线程运行,这调用线程对象。而不是使用 AAPI.main() 从您的 AAPL 文件中调用函数。创建一个类 AAPL 并编写将在 run 函数中运行 main 的代码,然后使用线程来运行您的 AAPL 对象。如果你想杀死那个线程或停止它,只需调用一个停止函数。您需要查看如何创建线程对象才能知道我在说什么。我想这是做你想做的事情的正确方法。
  • 感谢所有研究人员,我会全力以赴!当我知道更多时我会回来报告
【解决方案2】:

这应该足够了。

import AAPL
import GOOG

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

sys.exit将退出当前python的执行,这将不允许GOOG.main()执行。

【讨论】:

  • 感谢您的评论,不幸的是,由于某种原因这不起作用,如果我用 print(text) 这样做它确实有效,我打赌当我使用 AAPL.main() 时它不会跨度>
  • 两个主要函数的注释是什么?他们到底是做什么的?
  • 主要功能从 API 检索数据并将其存储到 .txt 文件中
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2021-02-10
  • 2022-01-02
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多