2012-11-04 88 views
4

我需要編寫一個python腳本來讀取和解析安裝python文件。 安裝程序包含一些變量和函數調用。解析python安裝文件

例如:

setup.py 
x = 5 
mylist [ 1, 2, 3] 
myfunc(4) 
myfunc(5) 
myfunc(30) 


main.py 
. 
parse_setup('setup.py') 
. 

我想解析安裝文件,並「看到」被定義什麼樣的變量和什麼樣的函數調用。 由於使用python編寫的安裝文件,我以爲最簡單的事情是動態導入安裝文件(動態,因爲安裝文件路徑是主要的輸入)。

問題是導入失敗,因爲myfucn(),在setup.py中調用,未定義。

有沒有辦法讓我攔截中的myfunc()調用並執行我自己定義的函數main.py

如果我想執行的函數是一個成員函數呢?

任何人都可以想到一個更好的方式來提取設置文件中的數據,我真的不想逐行閱讀它。

謝謝!

+0

如何安裝運行在所有的,如果myfunc()沒有定義?如果你只是想以python腳本格式進行良好的配置,可以將配置中使用的函數重構爲一個單獨的模塊,並從設置中導入。 –

+0

如果它不是一個有效的python文件(即運行它會得到一個異常),那麼你將無法「導入」。你可以[閱讀](http:// stackoverflow。com/a/6475407/1240268)它像任何其他文本文件? –

+0

這正是我想避免的。 setup.py實際上是一個由用戶填寫的文本文件。 設置文件是Python語言的原因是因爲它是大陸上定義變量和函數「調用」。 myfunc()只是用戶希望main.py執行的操作的描述。 – idanshmu

回答

1

如果您setup.py文件包含在這些Python語句:

x = 5 
mylist = [ 1, 2, 3] 
y = myfunc(4) 
z = myfunc(x) 

你可以做這樣的事情在main.py找出它定義了什麼:

def myfunc(n): 
    return n**2 

def parse_setup(filename): 
    globalsdict = {'__builtins__': None, 'myfunc': myfunc} # put predefined things here 
    localsdict = {} # will be populated by executed script 
    execfile(filename, globalsdict, localsdict) 
    return localsdict 

results = parse_setup('setup.py') 
print results # {'y': 16, 'x': 5, 'z': 25, 'mylist': [1, 2, 3]} 
+0

我只想添加,@ user1798187,你在這裏有一個巨大的安全漏洞。用戶可以很容易地通過社交工程設計另一個用戶來運行一個配置本地根或者''rm -rf〜''。 –

+0

@Jonas Wielicki:爲了解決您的問題,我添加了一個'__builtins__':None'條目到globals字典的定義,以防止Python自動添加一個引用到標準的'__builtin__'模塊,否則它會做 - 這會大大減少通過對安裝文件執行的上下文進行更多的控制來解決安全問題。這樣做意味着Python所具有的所有可能具有破壞性的內置函數,特別是'__import__',將不會被腳本用於惡意目的。 – martineau

+0

既然這個腳本是內部腳本,我不認爲我應該擔心這個問題,但只要我們知道這個問題,你能詳細說明你究竟是什麼意思? 你能舉一個惡意的setup.py文件的例子嗎? – idanshmu

0

如果setup.py文件是有效的python,您可以使用execfile()或import()。

execfile與您似乎正在尋找的東西很接近。

setup.py

def function(): print "called" 

main.py

execfile("setup.py") 
function() # will print called 

http://docs.python.org/2/library/functions.html#execfile

再次閱讀您的問題一個更好的例子後可能:

setup.py

func("one") 
func("two") 

main.py

def func(s): print s 
execfile("setup.py") 
# will print: 
# one 
# two 

注意的是,文件加載具備的功能已經被定義之後進行。

+0

setup.py沒有定義任何函數。它只是「調用」功能。其實,setup.py可以被認爲是提供給用戶的文本文件。 用戶不熟悉python。 他使用main.py首先生成一個模板setup.py文件,然後他用他想要的數據填充這個文件。 我需要提取這些數據並找出用戶想要如何激活main.py。 – idanshmu

+0

我已經發布了一個編輯的例子,請再閱讀一次。 – iagorubio

+0

感謝您的快速回復。 martineau答案爲我工作。 我無法嘗試你的解決方案,但無論如何謝謝你。 – idanshmu