2012-08-02 72 views
1

我使用python腳本自動化項目創建。我可以在python中創建存儲庫,簽出,提交和導入目錄。在Python腳本中使用SVN Propset

它似乎不會做的是設置svn:externals屬性。我可以從命令行設置它,但是當我嘗試運行帶有subprocess.call的命令時,它不起作用。

這裏的命令行(即工作在簽出項目目錄時):

svn propset svn:externals "trunk/Source/Interactive/Flash.Externals https://server/svn/proj/" . 

這裏的腳本調用(檢查回購出gv.project_repo_dir後運行):

# gv is a global variables object 
odir = getcwd() 
chdir(getcwd() + '/' + gv.project_repo_dir) 
res = call(['svn', 'propset', 'svn:externals',            \ 
      '"'+ gv.interactive_subpath +'Flash.Externals '+ gv.mirror_project_repo_url +'"', \ 
      '.']) 
chdir(odir) 

這是腳本運行的錯誤:

svn: Error parsing svn:externals property on '.': '"trunk/Source/Interactive/Flash.Externals https://server/svn/proj/"' 

我試過這個與shell=True作爲arg到call且沒有;沒有骰子。

任何想法?

統計:

  • 的Python 2.7
  • 的Windows Server 2003
  • 的VisualSVN

回答

1

我會建議看pysvn模塊與通過命令行做它:

http://pysvn.tigris.org/

但是,如果你要通過命令行來做到這一點,你可以使用使用os.system調用而不是子進程?

os.system('svn propset svn:externals "trunk/Source/Interactive/Flash.Externals https://server/svn/proj/" . ') 

應該運行「作爲shell」,你只是無法從它得到反饋 - 它會運行命令並等待命令完成。

也就是說,或者你可以嘗試打破的命令,(不是100%肯定,如果這個工作在Windows,但很肯定):

import shlex 
commands = shlex.split('svn propset svn:externals "trunk/Source/Interactive/Flash.Externals https://server/svn/proj/" .') 
subprocess.call(commands) 
+0

'os.system()'做到了!該命令現在運行良好(雖然我認爲我的目標目錄可能是錯誤的,因爲它實際上並沒有鏈接到外部 - 但這是另一個問題)。謝謝!順便說一下,'os.system()'確實會在Windows NT,2000和XP上返回執行程序的返回碼。我*曾*看過pysvn,但我們必須記得升級,以便我們將來升級我們的svn服務器,這是跟蹤可能會破壞事情的另一件事。 – paul 2012-08-03 12:57:55

+0

對不起 - 是的,os.system將返回返回代碼,但是如果你想說的話,你不能像在子進程中那樣對stdout/stdin/stderr進行PIPE操作,將命令的輸出記錄到文件或任何東西。 而我聽到雅保持依賴關係簡單..所以爲;-) – 2012-08-03 16:49:04

+0

作爲一個側面說明,但我仍然不知道爲什麼shell = True不適用於Windows壽。它在Python的頁面上記錄爲不支持Windows ...你只是覺得它不會很難支持... – 2012-08-03 16:49:56

0

我不知道我買的「它不與外殼工作=真「聲明。該錯誤顯示它將雙引號解釋爲文字,因爲它試圖使用"trunk/Source/Interactive/Flash.Externals https://server/svn/proj/"作爲execvp參數之一。雙引號只對shell有特殊意義。

例子:

>>> subprocess.call(["ls", '"."'], shell=False) 
ls: ".": No such file or directory 
2 

用shell =真:

>>> subprocess.call(["ls", '"."'], shell=True) 
metrics_poller.sock OSL_PIPE_0_SingleOfficeIPC_b919ef148f655fcebc4bf633c062a098 sv9hg.tmp 
metrics.sock   proc_mgr_stats            userinstall.mBa793 
mysql_tzinfo_stderr sess_716518f985ab8de017981347a8b61c611c9880bd    userinstall.omY802 

嘗試刪除雙引號如果shell =真變化真的沒有幫助。

res = call(['svn', 'propset', 'svn:externals',            \ 
      gv.interactive_subpath +'Flash.Externals '+ gv.mirror_project_repo_url, \ 
      '.']) 
+1

殼=真不能在Windows遺憾的是工作... – 2012-08-02 22:22:53

+0

好趕上!我讓前斜線騙了我。 – 2012-08-06 13:59:40

+0

爲什麼他們決定讓路徑目錄分隔符與C字符串轉義字符相同,我永遠不會知道。 – paul 2012-08-06 14:10:09