簡體   English   中英

subprocess.call vs os.system python

[英]subprocess.call vs os.system python

第一次在這里提問:

我需要在Windows中映射網絡驅動器。 該位置是內部共享點文檔庫。

在cmd窗口中:

net use g: http://na.com/DMP/DMP/programming/

是成功的 - >命令完成了

os.system('"net use k: http://na.com/DMP/DMP/programming/"')

也很成功。

但是我想在已經映射驅動器的情況下使用subprocess.call - 我想嘗試另一個驅動器

call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])

這失敗了“系統錯誤67已經發生。無法找到網絡名稱”我已經為最后一個列表項嘗試了很多選項而沒有運氣。

任何想法我可以在那里完成成功完成或不同的方法來映射驅動器。

您的代碼中至少存在兩個問題:

call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])

首先,你有":q" ,你的意思是"q:" 這可能會導致net命令將:q解釋為您的網絡位置而不是目標驅動器,這可能會導致錯誤67。

其次,您在網址周圍有一組額外的引號: '"http://na.com/DMP/DMP/programming/"'您應該在哪里使用'http://na.com/DMP/DMP/programming/' subprocess構建要傳遞給CreateProcess的字符串時,它已經引用了每個參數。 所以,如果你自己引用它們,你最終會雙重引用這些參數。 在某些情況下,這在Windows中實際上是不可能的,所以你最終會得到垃圾,但我認為這不是這種情況。 你會成功獲得此引用的字符串來net ,告訴它你想打開或者開始使用相對路徑"http:或協議的URL "http ,或類似的東西。 無論是什么,它都不是一個可用的網絡位置,很可能會導致錯誤67。

正如Ben指出的那樣,你的system調用有一個類似的問題 - 你在整個字符串周圍放了一對額外的引號。 如果你真的想弄清楚,可能有一些原因可以解決這個問題...但我認為你不想弄明白。 只是把它當作“我做錯了,但我很幸運”,並且不要在將來這樣做。

最后,正如文檔所說:

在Windows上,args序列轉換為可以解析的字符串

這意味着,如果您已經擁有適用於Windows的工作命令行,那么最好將其用作字符串,而不是嘗試將其分解為subprocess重新組合的序列。

(請記住,這是僅適用於Windows真!在其他平台上,而不是建立一個命令行字符串傳遞給在函數CreateProcess家庭, subprocess建立一個字符串數組傳遞到在一個函數exec家庭。)

所以,就這樣做:

call("net use g: http://na.com/DMP/DMP/programming/")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM