2012-10-12 64 views
5

抱歉,如果我在此期間遇到了一些事實錯誤,但自從我在我的學校開始計算課程後,我只編程了大約一年,如果此問題已經在我到處尋找之前回答,但我不知道要尋找什麼。最近我發現了一個遊戲,你可以用注射器注入Python代碼到它,但找到的代碼的唯一方法是使用:試圖在Python中打印模塊中的每個子模塊

import modulename 
    print dir(modulename) 

然後 打印目錄(modulename.submodulename)

這會將該模塊內的所有子模塊打印到遊戲的日誌文件中。使用這種技術,我開發了一個腳本,它在執行時會查找該目錄中的所有子模塊並將它們寫入文件。

import modulename 

myfile=open("name.txt","w") 
myfile.write("modulename\n") 

for a in dir(modulename): 
    a="modulename"+"."+a 
    for b in dir(a): 
     b=a+"."+b 
     for c in dir(b): 
      c=b+"."+c 
      if ".__" in c: 
       pass 
      elif "._" in c: 
       pass 
      else: 
       myfile.write(c+"\n") 
     if ".__" in b: 
      pass 
     if "._" in b: 
      pass 
     else: 
      myfile.write(b+"\n") 
    if ".__" in a: 
     pass 
    if "._" in a: 
     pass 
    else: 
     myfile.write(a+"\n") 

print "Done" 
myfile.close() 

不幸的是,當運行過「something.something」時,模塊不存在。這裏是模塊「Random」的一個例子,其中「random.weibullvariate」是一個真正的模塊,但任何東西都超過了第二個「。」。不在隨機子模塊中。

random.weibullvariate.title.translate 
random.weibullvariate.title.upper 
random.weibullvariate.title.zfill 
random.weibullvariate.title 
random.weibullvariate.translate.capitalize 
random.weibullvariate.translate.center 
random.weibullvariate.translate.count 
random.weibullvariate.translate.decode 
random.weibullvariate.translate.encode 
random.weibullvariate.translate.endswith 
random.weibullvariate.translate.expandtabs 
random.weibullvariate.translate.find 
random.weibullvariate.translate.format 
random.weibullvariate.translate.index 
random.weibullvariate.translate.isalnum 
random.weibullvariate.translate.isalpha 
random.weibullvariate.translate.isdigit 
random.weibullvariate.translate.islower 
random.weibullvariate.translate.isspace 
random.weibullvariate.translate.istitle 
random.weibullvariate.translate.isupper 
random.weibullvariate.translate.join 
random.weibullvariate.translate.ljust 
random.weibullvariate.translate.lower 
random.weibullvariate.translate.lstrip 
random.weibullvariate.translate.partition 
random.weibullvariate.translate.replace 
random.weibullvariate.translate.rfind 
random.weibullvariate.translate.rindex 
random.weibullvariate.translate.rjust 
random.weibullvariate.translate.rpartition 
random.weibullvariate.translate.rsplit 
random.weibullvariate.translate.rstrip 
random.weibullvariate.translate.split 
random.weibullvariate.translate.splitlines 
random.weibullvariate.translate.startswith 
random.weibullvariate.translate 

正如你所看到的,有些子模塊被放入,不存在於「隨機」中。 我最終找出了問題所在,但我沒有足夠的經驗來解決問題。

的問題是,使用第2行作爲一個例子

for a in dir(modulename): 
    a="module name"+"."+a 

,如果我做了一個 「modulename.submodule」 正如你所看到的「a」是一個字符串,如果我再將「a」放入「dir()」中,則無論子模塊的名稱是什麼,都會返回同樣的結果。

我需要找到一種方法來將子模塊添加到以前的模塊名稱中,使用「。」在沒有把它變成一個字符串之間。

對不起,很長的文章,任何人有任何想法?

+1

也許我錯了你在問什麼,無論如何,你可以通過'__name__'屬性獲得模塊名稱,你可以使用''。'。join([「package」,「subpackage」,「module」 ])'用點加入可變數量的字段。 – Bakuriu

+0

我會試試這個,謝謝。我會回覆,如果我得到任何地方:) – Freshollie

+0

你的意思是這樣嗎? 「for b in dir(」。「。join([modulename,a])):」 – Freshollie

回答

4
import types 

def list_modules(module_name): 
    try: 
     module = __import__(module_name, globals(), locals(), [module_name.split('.')[-1]]) 
    except ImportError: 
     return 
    print(module_name) 
    for name in dir(module): 
     if type(getattr(module, name)) == types.ModuleType: 
      list_modules('.'.join([module_name, name])) 

不能聲稱這將適用於所有情況,但值得一試?

+0

我會放棄這一點,謝謝。 – Freshollie

+0

我在哪裏,我想用這個,如果我嘗試和輸入模塊到這一點,給了「>>> list_modules(隨機) 回溯(最近最後一次通話): 文件」 」,1號線,在 list_modules(random) list_modules module = __import __(module_name,globals(),locals(),[module_name.split]中的文件「C:/ Users/FreshOllie/Documents/Python(Computing)/test.py」 ('。')[ - 1]]) AttributeError:'module'對象沒有'split'屬性 – Freshollie

+0

'module_name'是一個字符串,嘗試'list_modules('random')'而不是(儘管'random'沒有子模塊,所以它不會很有趣)。 – ezod