2011-07-06 47 views
2

作爲我的基於python的程序的一部分,我必須調用一個Java程序 - 用os.system()完全解決這個問題。它運行良好,直到我將整個事物從一個目錄移到另一個目錄。我更改了python代碼中的所有文件路徑,並且java程序 - 盡我所知,我不太瞭解java - 依賴於相關文件路徑,這些文件路徑在移動過程中未被更改。但是現在,java程序不會打開。命令行看起來幾乎立即消失,所以我知道os.system()正在工作。它必須與我在os.system中使用的文件路徑有關,因爲當我將它改回到原始文件路徑時,它再次正常工作。代碼如下:通過命令行從python調用java程序的奇怪錯誤

os.system("java -jar C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames) 

其中fileNames是一個變量thingie作爲參數傳遞給java程序,我相當肯定不是問題。如果我直接從cmd.exe調用python程序,那麼它會讓我回到「無法訪問Jarfile C:\ Documents」錯誤消息。我想這可能與在文件路徑的空間做的,所以我把下劃線在:

os.system("java -jar C:\\Documents_and_Settings\\enginx_mgr.ISIS\\My_Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames) 

它給了我同樣的「無法訪問jar文件」的消息,但這次完整的文件路徑。在文件路徑上試着os.path.exists()返回true,所以python知道它是一個真正的文件路徑;我想這肯定是命令行不同意它,但我不知道爲什麼。有任何想法嗎?

編輯:原始文件路徑,如果感興趣的,是C:\Inetpub\ftproot\JPivSource\jpivc.jar

編輯2:它幾乎可以肯定不是文件路徑,通過下面的答案和事實去,他們沒有工作(和原來的文件路徑作品)。從預感中檢查安全選項,並且我完全控制.jar文件,就像系統一樣,所以它不是因爲安全原因無法訪問它。仍然在零平方。

+3

你不應該在路徑中使用反斜槓。正斜線適用於所有系統,反斜線適用於Windows。除此之外,'subprocess'有一些很好的功能,通過一個數組獲取命令和參數,所以你不需要引用等。 – ThiefMaster

+2

我非常懷疑你的兩條路徑是相同的。這裏有一個類似的問題:http://stackoverflow.com/questions/204017/how-do-i-execute-a-program-from-python-os-system-fails-due-to-spaces-in-path – Jacob

+0

你的意思是你實際上在你的系統上重命名爲「文檔和設置」?或者你是否只在電話中放置了_而不是空格?我建議嘗試將jar的名稱放在轉義引號中:「java -jar \」指向jar \「%s」的路徑。 – Nodebody

回答

0

您的問題看起來是由於某處出現拼寫錯誤而導致的。這應該可以解決它:

  • 打開Windows資源管理器
  • 在文件上點擊右鍵
  • 單擊「屬性」
  • 粘貼複製到該位置定位到你的腳本,使用目錄逃脫。
+0

它絕對不是一個錯字。我開始認爲它實際上不是導致錯誤的文件路徑,但是我不知道它是什麼。 –

1

不是一個直接的答案,但...

我覺得這是更好地撥打.bat文件,而不是直接調用許多命令行選項爲Java。這樣你就不需要改變Python程序來添加一些其他選項(如-Xms2048m-Dfile.encoding=utf8)。

這樣的.bat文件也比較容易調試。

0

你必須把你的路徑引號。

os.system('java -jar "C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar" %s' % fileNames)

0

我爲提供了另一個文件路徑的解決方案很抱歉,但是這並沒有提及,而且它很可能是路徑的變化會造成問題。所以,如果你不介意羞辱我?

os.system("java -jar C:\\Documents\ and\ Settings\\enginx_mgr.ISIS\\My\ Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar %s"%fileNames) 

我所做的所有事情都不一樣,就是用反斜槓逃避空間。

你說os.path.exists返回True,這很好,但你試圖通過傳遞一些參數來執行一個命令行程序。讀取參數的程序將由於空格而將字符串解釋爲多個字符串。

您也可以嘗試改變你正在使用引號:

os.system('java -jar "C:\\Documents and Settings\\enginx_mgr.ISIS\\My Documents\\ISAProgramFiles\\JPivSource\\jpivc.jar" %s' % fileNames) 

您正在使用的文件路徑看起來很奇怪。