"我想做的是“
- Android应用程序(ADMIN),从用户获取作业标题,并使用Scrapy(Python)获取所有与之相关的作业,通过API将其保存到数据库。
- Android应用程序(CLIENT),通过API从数据库中获取所有数据。
**问题:**我在如何将我的python脚本与Ktor连接上遇到了麻烦。
一些代码,以便更清楚地说明:
import spiders.Linkedin as linkedinSpider
linkedinSpider.main(numberOfPages=1, keywords="ios developer", location="US")
这段代码运行良好,帮助我获取数据并将其存储到数据库中,如果保存成功,则返回True,否则返回False。我只需要调用此函数,所有的工作都为我完成。
同样地,
这是我如何从用户通过API从管理员端使用KTOR获得数据。这也工作得很好。
// Fetchs New Jobs.
get("/fetch") {
val numberOfPages = call.request.queryParameters["pages"]?.toInt() ?: 1
val keyword = call.request.queryParameters["keyword"]
val location = call.request.queryParameters["location"]
if (numberOfPages < 1) {
call.respond(
status = HttpStatusCode.BadRequest,
message = Message(message = "Incorrect Page Number.")
)
} else {
call.respond(
status = HttpStatusCode.PK,
message = Message(message = "Process Completed.")
)
}
}
这就是我希望代码逻辑工作的方式。
// Fetch New Jobs.
get("/fetch") {
val numberOfPages = call.request.queryParameters["pages"]?.toInt() ?: 1
val keyword = call.request.queryParameters["keyword"]
val location = call.request.queryParameters["location"]
if (numberOfPages < 1) {
call.respond(
status = HttpStatusCode.BadRequest,
message = Message(message = "Incorrect Page Number.")
)
} else {
// TODO: Call Python Function Here and Check the Return Type. Something Like This.
if(linkedinSpider.main(numberOfPages=numberOfPages, keywords=keyword, location=location)) {
call.respond(
status = HttpStatusCode.OK,
message = Message(message = "Process Completed.")
)
} else {
call.respond(
status = HttpStatusCode.InternalServerError,
message = Message(message = "Something Went Wrong.")
)
}
}
}
另外,这是两个不同的单独项目。我需要合并它们吗?当我尝试时,它说没有python解释器在intelliJ中找到,我正在使用它作为Ktor Development的IDE。我还尝试配置python解释器,但似乎没有用,因为它不能引用变量或python文件。
编辑1
"这就是我的努力"
val processBuilder = ProcessBuilder(
"python3", "main.py"
)
val exitCode = processBuilder.start().waitFor()
if (exitCode == 0) {
println("Process Completed.")
} else {
println("Something Went Wrong.")
}
}
我得到的exitCode是2。但是当我运行下面的代码时,它与exitCode0一起工作。
ProcessBuilder("python3", "--version")
编辑2
在此之后,代码工作但不终止,我没有得到输出
这是我为模拟问题而创建的Kotlin文件。
package com.bhardwaj.routes
import java.io.File
fun main() {
val processBuilder = ProcessBuilder(
"python3", "main.py", "1", "android", "india"
)
processBuilder.directory(File("src/main/kotlin/com/bhardwaj/"))
val process = processBuilder.start()
val exitCode = process.waitFor()
if (exitCode == 0) {
val output = String(process.inputStream.readBytes())
print("Process Completed -> $output")
} else {
val output = String(process.errorStream.readBytes())
print("Something went wrong -> $output")
}
}
如果我在终端运行相同的命令,它的工作.
python3 src/main/kotlin/com/bhardwaj/main.py 1 "android" "india"
在终端中运行相同的命令后,输出为-〉
编辑3
当我停止默认的Scrapy日志记录时,代码工作了。似乎在Process Builder中对输出流有一些限制。下面是我所做的。
def __init__(self, number_of_pages=1, keywords="", location="",**kwargs):
super().__init__(**kwargs)
logging.getLogger('scrapy').setLevel(logging.WARNING)
这在开发模式下运行得很完美。但是我还有一些事情要讨论。当我在Heroku上部署了同样的东西,并发出了一个get请求,30-40秒后,我得到了503服务不可用。但是又过了20-30秒,我把数据导入了数据库。这似乎让人很困惑为什么会发生这种情况。
为了程序的流程和清晰度-当我向ktor发出get请求时,它请求Scrappy(一个python程序)来抓取数据并将其存储在JSON文件中。在所有过程完成后,它向另一个端点发出请求,将所有数据存储到数据库中,在所有这些操作完成后,它将返回特定的状态代码,并使用call.respond
作为输出响应用户在克托。
这个问题是由于python程序向端点发出的另一个请求引起的,还是与我们一次只能处理一个进程的heroku有关。因为开发模式(即localhost url
)没有问题
1条答案
按热度按时间mspsb9vt1#
当我停止默认的Scrapy日志记录时,代码工作了。似乎在Process Builder中对输出流有一些限制。下面是我所做的。