簡體   English   中英

相當於Python中的%*

[英]%* 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.systemos.system更好。 原因之一是您不必擺弄報價。 您可以這樣做:

subprocess.check_call([program] + sys.argv[1:], shell=True)

仍然有人需要將參數列表放回字符串中,以便可以將其傳遞到外殼程序,但是現在“某人”是subprocess模塊,而不是您的代碼。

暫無
暫無

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

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