2017-07-14 39 views
-1

我有一個運行在命令提示符下一個VBA腳本:是sys.argv中字符串的值?我需要列出

D:\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\python.exe D:\GITREPOS\PythonInertia\govlauncher.py [1.1304891,0.5510243,-10.5614766,64.1317974,9483.8000655,9309.4488664,906.3935329,-25.6269843,198.8456995,167.5522187] [0,0,0,0,0,0,0,0,0,0] [0,0,0,0,0,0,0,0,0,0] On 3.8 1800 1900 88.5 -13.64 10 61 16 39.465 True 

運行稱爲govlaunch.py​​一個python文件採取了一堆,我通過使用sys.argv中的參數解析[1]或sys.argv [n]。

Strangly,sys.argv [1]顯示爲[1.1304891,0.5510243,-10.5614766,64.1317974,9483.8000655,9309.4488664,906.3935329,-25.6269843,198.8456995,167.5522187]這正是我想要的...但它是一個字符串,而不是像我預期的列表。

是否所有的值sys.argv中[0]通過sys.argv中[14]將是字符串類型?我如何去改變他們到我需要的東西?

+4

您可以使用['ast.literal_eval'](https://docs.python.org/2/library/ast.html#ast.literal_eval)將字符串解析爲文字 – khelwood

+0

有了這麼多的數據,通過,你最好將它存儲在結構化文件中,然後從中加載。否則,你遲早會遇到執行shell部分混淆了輸入的問題。 – poke

回答

3

可以使用解析字符串作爲文字ast.literal_eval

import ast 
s = "[1.1304891,0.5510243,-10.5614766,64.1317974,9483.8000655,9309.4488664,906.3935329,-25.6269843,198.8456995,167.5522187]" 
x = ast.literal_eval(s) 
print (x) 
print (type(x)) 

輸出由逗號分隔字符串:

[1.1304891, 0.5510243, -10.5614766, 64.1317974, 9483.8000655, 9309.4488664, 906.3935329, -25.6269843, 198.8456995, 167.5522187] 
<type 'list'> 
+0

我喜歡這個,如果你知道你必須通過第一個參數列表 – codyc4321

+0

哇,它的工作就像你說的那樣!我沒有想到參數是字符串,但現在我知道我可以處理它,這要歸功於你!我真的很感激你花時間幫助一個愚蠢的問題! –

1

可以採用分體式()函數返回一個列表

+0

謝謝!我忘了那個方法,python很酷=) –

0

見下面的腳本:

syspython.py:

#!/usr/bin/env python 

import sys 

print(sys.argv) 

這會導致:

cchilders:/tmp 
$ python syspython.py one two three 
['syspython.py', 'one', 'two', 'three'] 

我想通過這些ARGS,如:

D:\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\python.exe D:\GITREPOS\PythonInertia\govlauncher.py 1.1304891 0.5510243 -10.5614766 64.1317974 9483 

只是一個空間,或報價分開,如果ARG有一個像「一書題空格應引述」

下面如前所述,你也只能分割他們,如果你有:

In [1]: x = "[1234,645,44,777]" 

# get ride of [ and ] 
In [2]: x = x.replace('[', '').replace(']', '') 

In [3]: number_list = x.split(',') 

In [4]: number_list 
Out[5]: ['1234', '645', '44', '777'] 

這裏是一個不錯的功能轉換你的論點1項:

def stringlist_to_real_list(input_string): 
    clean_input = input_string.replace('[', '').replace(']', '') 
    return clean_input.split(',') 

使用它:

In [1]: x = "[23,644,777,444,333]" 

In [2]: def stringlist_to_real_list(input_string): 
    ...:  clean_input = input_string.replace('[', '').replace(']', '') 
    ...:  return clean_input.split(',') 
    ...: 

In [3]: stringlist_to_real_list(x) 
Out[3]: ['23', '644', '777', '444', '333'] 

所以,現在在你的腳本不喜歡:

these_numbers_as_list = stringlist_to_real_list(sys.argv[1]) 
+1

感謝您的諮詢!不幸的是,我無法改變參數的傳遞方式......還沒有。所以我只需要和他們打交道。但我完全忘記了拆分方法,我會放棄! –

+0

上面的例子完成了,我只是在函數中拋出線。 Enjoy – codyc4321

0

不要sys.argv直接讀取,使用命令解析器如。 argparse。這允許輕鬆地傳遞和投射多種類型;你不需要手動施放不同的字符串輸入你想要的,只有指定什麼類型的參數應該被強制定義參數時。

您可以傳遞整數作爲參數列表,可以將其作爲一個參數,並指定包含的類型:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--list', nargs='+', type=int) 
+0

謝謝你的建議,我可以問你爲什麼不應該直接從sys.argv讀取? –

+0

@KeyboardBandit當然,你可以,但有了多個參數,解析器可以更好地工作。 –

0

是。

跑步;

import sys 
for arg in sys.argv: 
    print(type(arg)) 

With;

python debug.py foo "bar" 123 False 1.23 

輸出以下內容;

<type 'str'> 
<type 'str'> 
<type 'str'> 
<type 'str'> 
<type 'str'> 
<type 'str'> 

如果要分析他們使用的解析器,如​​。

相關問題