2013-07-15 120 views
1

所以我有一個python腳本生成一個networkx圖並將其導出爲.graphml,我希望腳本也能夠打開cytoscape,並且加載的網絡沒有任何工作用戶部分。我明白了:使用cmd和Python在Cytoscape中打開一個網絡文件

cytoscape.bat -N C:\Somepath\with\a\networkx.graphml 

它在我使用它時正常工作。一樣:

cd "C:\Program Files\Cytoscape_v3.0.0" 
cytoscape.bat 

不過,我似乎無法得到任何os.systemsubprocess正常運行,我現在的配置是:

p = subprocess.Popen("cytoscape.bat", cwd="C:/Program Files/Cytoscape_v3.0.0") 
stdout, stderr = p.communicate() 

但拋出一個文件未找到的異常。

我一直在閱讀其他stackoverflow文章和python文檔上運行.bats和做cmd操作,並可以獲得基本工作。但是,這似乎更復雜一些,我不確定我要去哪裏錯了!

按照要求我的例外:

未發現不正確的文件路徑例外:

Traceback (most recent call last): 
    File "CytoScapeExporter.py", line 219, in <module> 
    p = subprocess.Popen("cytoscape.bat", cwd="\"C:/Program Files/Cytoscape_v3.0 
.0\"") 
    File "C:\Python27\lib\subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 896, in _execute_child 
    startupinfo) 
WindowsError: [Error 267] The directory name is invalid 

Traceback (most recent call last): 
    File "CytoScapeExporter.py", line 219, in <module> 
    p = subprocess.Popen("cytoscape.bat", cwd="C:/Program Files/Cytoscape_v3.0.0 
") 
    File "C:\Python27\lib\subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 896, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

稍微不同的JVM錯誤,就會通過這個代碼生成:

os.system("\"C:/Program Files/Cytoscape_v3.0.0/cytoscape.bat\"") 

Error: missing `server' JVM at `C:\Program Files (x86)\Java\jre7\bin\server\jvm. 
dll'. 
Please install or use the JRE or JDK that contains these missing components. 
C:\Program Files\Cytoscape_v3.0.0 
+0

你能爲我們提供完整的例外數據? – jsalonen

+1

完成,我添加了一個陌生人JVM錯誤,什麼使用os.system調用產生它 – Darkstarone

+1

您是否在cytoscape.bat目錄中運行Popen命令?'cwd'在執行命令之前更改目錄,但是[文檔](http://docs.python.org/2/library/subprocess .html#popen-constructor)說:搜索可執行文件時不考慮這個目錄,所以**你不能指定相對於cwd **的程序路徑。 –

回答

1

the documentation

「如果cwd不是None,t在執行之前,他孩子的當前目錄將改爲cwd。 請注意,搜索可執行文件時不考慮此目錄,因此您無法指定程序相對於cwd的路徑。

你要通過命令subprocess.Popen的完整路徑。