我正在嘗試從 java 內部運行一個非常簡單的 python 腳本來清除并寫入 CSV 檔案,但我在執行此操作時遇到了很多麻煩。
這些腳本不需要任何輸入,輸出全部寫入 CSV 檔案,所以我需要做的就是讓 python 腳本通過我的 java 代碼運行。
下面是我在互聯網上看到的一些代碼,但似乎對我不起作用。似乎對于這兩個腳本,使用此命令對 csv 沒有任何作用。不會拋出任何錯誤,并且 java 程式可能只是在不執行 python 腳本的情況下退出。
public static void main(String[] args) throws IOException
{
Process p = Runtime.getRuntime().exec("python Refresh.py");
}
這是我要運行的腳本。
腳本1:
file = open("products.csv","r ")
file.truncate(0)
file.close()
腳本2:
from bs4 import BeautifulSoup as soup
from urllib.request import Request, urlopen
import time
filename = "products.csv"
f = open(filename, "a")
#connects to the page and reads and saves raw HTML
for i in (0,25,50,75):
my_url = 'https://www.adorama.com/l/Computers/Computer-Components/Video-and-Graphics-Cards?startAt=' str(i) '&sel=Expansion-Ports_HDMI'
hdr = {'User-Agent': 'Mozilla/5.0'}
client = Request(my_url,headers=hdr)
page = urlopen(client).read()
#parsing the HTML
page_soup = soup(page, "html.parser")
#print (page_soup.h1)
containers = page_soup.findAll("div",{"class":"item"})
#print (len(containers))
containers.pop()
for container in containers:
title_container = container.findAll("div",{"class":"item-details"})
title = title_container[0].h2.a.text.strip()
status_container = container.findAll("div",{"class":"item-actions"})
status = status_container[0].form.button.text.strip()
if (status == "Temporarily not available"):
status = "Out of stock"
else:
status = "In stock"
price = container.find("div","prices").input["value"]
link = container.a["href"]
f.write(title.replace(",", "|") "," price.replace(",", "") "," status "," link "\n")
time.sleep(0.01)
f.close()
java 檔案、Python 腳本和 csv 檔案都在同一個檔案夾中。
uj5u.com熱心網友回復:
使用較新的 ProcessBuilder 類:
ProcessBuilder pb = new ProcessBuilder("python","Refresh.py");
Process p = pb.start();
希望對你有用!
uj5u.com熱心網友回復:
您沒有檢查 python 腳本中的錯誤。您可以通過將 STDERR 合并到 STDOUT 并將 STDOUT 的內容報告給控制臺來簡單地實作這一點:
Process p = new ProcessBuilder("python", "Refresh.py")
.redirectErrorStream(true)
.start();
p.getInputStream().transferTo(System.out);
int rc = p.waitFor();
這應該從 python 列印出錯誤訊息并回傳錯誤代碼。您可能遇到檔案路徑問題,因此您可能需要將引數調整為“python”和/或“Refresh.py”的顯式路徑名。
uj5u.com熱心網友回復:
我設法通過不斷閱讀 Python 檔案的“列印”和錯誤輸出來解決這個問題。雖然我仍然不完全理解這是如何解決問題的,但我最好的猜測是,Java 代碼會保持 Python 腳本“運行”,直到腳本本身完成它的作業,而不是僅僅打開腳本并立即繼續。
這是代碼:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test {
public static void main(String... args) throws Exception {
String[] callAndArgs = {"python3", "YourScript.py"};
Process p = Runtime.getRuntime().exec(callAndArgs);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String s;
while ((s = stdInput.readLine()) != null) {
//System.out.println(s);
}
while ((s = stdError.readLine()) != null) {
//System.out.println(s);
}
}
}
另一個值得注意的細節是,此代碼似乎僅在編譯并通過終端/Geany 運行時才有效。如果我用 IntelliJ 運行相同的東西,它就不起作用。再一次,我不確定為什么會這樣,但我懷疑 IntelliJ 可以在某種虛擬機中編譯和運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413688.html
標籤:
上一篇:繪制帶有可讀時間戳的csv檔案?
