[英]%* equivalent in python
有人知道python中批處理腳本的%*
等效嗎?
說明:在批處理文件%*
是在命令行中指定的所有參數-如果要將參數轉發到另一個程序,這將非常有用。
我的問題是我想將一個批處理調用轉換為python調用:
批量調用是:
trial.bat %*
什么是等效的python調用?(PS,我知道我可以遍歷整個sys.argv
列表並在一些字符串中附加參數,然后將其傳遞給批處理文件,但是我在這里尋找一種更簡單的解決方案)
我嘗試以下:
os.system('trial.bat '+sys.argv)
os.system('trial.bat '+sys.argv[1:])
但這是行不通的。 我也嘗試過使用argparse
類似的操作。 它也不起作用。 請幫忙。
sys.argv[1:]
非常接近。 問題是argv
是參數列表,而[1:]
是列表的一部分,而列表又是列表。 如果您想將所有參數組合在一起的字符串,可以再次加入它們:
os.system('trial.bat ' + ' '.join(sys.argv[1:]))
甚至更好的是,您使用subprocess
模塊,該方法的方法接受參數列表:
subprocess.check_call(['trial.bat'] + sys.argv[1:])
子進程在處理參數時更加靈活,其行為也類似於argv
的解析。 例如,當使用參數foo "hello world" bar
調用腳本時,argv將包含以下內容:
>>> sys.argv[1:]
['foo', 'hello world', 'bar']
現在,如果我們只是加入此列表,我們將得到一個字符串
>>> ' '.join(sys.argv[1:])
'foo hello world bar'
如您所見,復合參數hello world
的信息丟失了,從而導致了完全不同的含義。
但是,在使用subprocess
時,您將保留列表,並且子流程將自動確保將這些參數正確傳遞給被調用的程序。 因此,被調用的程序也可以將hello world
作為組合參數。
您需要subprocess.Popen
(或它的便利包裝之一):
import subprocess
import sys
process = subprocess.Popen(['trial.bat'] + sys.argv[1:])
process.wait()
絕對首選os.system
。 這樣做的好處是命令行參數可能需要加引號,以使其含義有效地保持被引號。 另外,這種選擇可能比os.system
更安全,因為它避免了創建子shell。
如果要使用os.system
,則需要手動將命令行重新組合在一起。 Python已經將命令行解析為單獨的參數(或者MSVCRT代表Python進行了解析)。 這意味着您不僅需要將它們重新連接在一起,還需要適當地引用它們。
stdlib中沒有任何東西可以完全按照MSVCRT的要求來“適當地報價”。 部分原因是Windows報價實際上是模棱兩可的。 在某些情況下,不可能往返。 但是,在簡單的情況下,可以使用POSIX風格的引號(帶有shlex.quote
)或僅在每個參數周圍使用顯式引號。 因此,這些:
args = ' '.join(shlex.quote(arg) for arg in [program] + sys.argv[1:])
args = ' '.join('"{}"'.format(arg) for arg in [program] + sys.argv[1:])
然后:
os.system(args)
但是使用subprocess
os.system
比os.system
更好。 原因之一是您不必擺弄報價。 您可以這樣做:
subprocess.check_call([program] + sys.argv[1:], shell=True)
仍然有人需要將參數列表放回字符串中,以便可以將其傳遞到外殼程序,但是現在“某人”是subprocess
模塊,而不是您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.