2009-12-28 3 views
0

이것은 내가 지금 작업하고있는 파이썬의 스 니펫입니다.이 코드를 모두 나열하지 않았으므로 필요한 것이 "누락되었습니다"라고 사과하는 경우 사과 드리겠습니다. 그것 ...가져온 함수가 반복되지 않습니다. "TypeError : 'NoneType'object> iserable이 아닙니다. ... 어떻게이 작업을 수행합니까?

아래에는 기능이 있습니다 main() - 이것은 내 스크립트에 명시 적으로 정의되어 있지 않습니다 - 다른 사람이 만든 다른 스크립트에서 가져 왔습니다. 호출 될 때 파이썬이 호출 할 수있는 모든 사용 가능한 모듈의 매우 긴 목록을 출력합니다. 각 모듈에 줄 번호를 추가하려고합니다. 그래서 출력 할 때 매우 긴 모듈 이름 목록입니다. (하나의 모듈을 출력하고 새로운 줄을 그리고 나서 다른 모듈 이름을 출력하기 때문에 각 모듈 다음에 ""이 나옵니다.)라고 가정합니다. 내가하려고하는 것은 그 값을 취하여 각 모듈 이름 앞에 줄 번호를 추가하는 것입니다.

elif x == "list" or x == "1": 

      print "\n loading... please wait" 
      time.sleep(2) 
      counter=0 

      lnumber = 0 
      all_mods = (main()) 

      for x in all_mods: 
       print lnumber, x 
       lnumber = lnumber + 1 
       counter = counter + 1 

      print "-" * 30, "\nTotal number of modules detected: ", counter 

는 ** 나는 내가 다른 곳에서이 설정을 사용하지 않은 문서에있는 코드와 일치하기 때문에 내가 일부러 이런 짓을의 lnumber 및 카운터 같은 일을보고하고 이해합니다.

이 코드 조각은 (스크립트의 다른 부분과) 실행됩니다

이 다시보고 :

Traceback (most recent call last): 
    File "C:\Users\jc\Documents\Python Projects\Projects\myOwnfns\helpwiz.py", line 131, in <module> 
    main_loop() 
    File "C:\Users\jc\Documents\Python Projects\Projects\myOwnfns\helpwiz.py", line 90, in main_loop 
    for x in all_mods: #this variable comes from "list_all_mods" - an external script taken from another author. 
TypeError: 'NoneType' object is not iterable 
+0

죄송합니다 아 - 내가 사용하는 데 문제가 있었다 ">"위로 머리를위한 감사합니다. –

+0

반으로 읽을 수 있습니다. 오류 추적을 수정하여 올바르게 형식화하십시오. 파이썬에서 일반적으로 보는 것이 아니기 때문에 줄 바꿈이 망가졌습니다. 파이썬 오류 추적으로 해결하십시오. 여기에 글을 게시 할 목적으로 네 칸을 적절하게 들여 씁니다. 적절한 형식을 지정하면 사람들이 귀하의 질문을 읽고 답변하기가 더 쉬워집니다. –

+0

k는 모두 고쳐졌습니다. 모든 통찰력/도움에 감사드립니다. 지금 제안을 검토하고 있습니다. –

답변

2

기능 main인쇄 표준 출력에 라인; 아무것도 반환하지 않습니다. 더 정확하게는 None 객체를 반환하므로 all_mods is None입니다. 그 이유는 "NoneType '객체가 반복 가능하지 않기 때문입니다. 왜냐하면 당신이 for x in all_mods으로 반복을 시도하기 때문입니다.

import sys, StringIO 
buffer = StringIO.StringIO() 
sys.stdout = buffer 
main() 
buffer.seek(0) 
all_mods = buffer.read().splitlines() 
sys.stdout = sys.__stdout__ 
+0

나는 많은 생각 (확인 주셔서 감사합니다)하지만, 그들 앞에 넣어 줄 번호 "표준 출력을 활용"하는 방법은 무엇입니까? 궁극적으로, 행 번호를 모듈 이름 (예 : 사전 형식)으로 매핑하기 때문에 행 번호를 입력 한 모듈 이름을 입력 한 다음 해당 번호로 작업 할 수 있습니다. main()에서 출력을 가져 와서 사전 형식 컨테이너에 넣은 다음 출력하는 방법을 생각 중입니다 ... (지금은 처음 인쇄되고 사전은 아무것도 사용하지 않습니다) - 어떻게이 작업을 수행 할 수 있습니까? –

0

내가 모든 가능한 경우, 리팩토링 list_all_mods()을 권하고 싶습니다 :

여기에 작동합니다 정말 hackish 솔루션입니다. 특히 값을 인쇄하지 말고 값을 반환하도록 변경하십시오. 또는 목록을 반환하는 새로운 함수 find_all_mods()으로 바꿀 및 list_all_mods()을 재정의 :

def list_all_mods(): 
    print '\n'.join(find_all_mods()) 

를 내가 당신의 코드가 아닙니다 알고, 그래서 이것은 옵션이 될하지 않을 수 있습니다. 그렇지 않다면 balpha의 해킹이 아마도 당신이 할 수있는 최선일 것입니다. 그 후, 행 번호와 모듈을 인쇄하려면, 당신이 할 수 있습니다

for (i, module_name) in enumerate(all_mods): 
    # n.b.: we use i+1 because we want numbering to start from 1. 
    print "%4d %s" % (i+1, module_name) 

추신, 난 당신을 "모든 모듈"로 계산 무엇인지 모르겠지만, 현재 수입하고있는 모듈의 경우, 당신은 할 수 그냥 sys.modules.keys()을보고 이걸 얻으세요.

0

nl 명령은이 작업을 수행합니다.

python the_existing_program.py | nl 

원하는대로 할 수 있습니다.

Windows에서 작업하는 경우 nl 버전을 매우 쉽게 작성할 수 있습니다.

import fileinput 
for n, line in enumerate(fileinput.input()): 
    print "%d %s" % (n, line) 

전화를 nl.py라고 가정 해 봅시다.

python the_existing_program.py | python nl.py 

원본 프로그램을 수정할 필요가 없습니다.

+0

내가 찾은 "http://www.ncsa.illinois.edu/UserInfo/Resources/Hardware/IBMp690/IBM/usr/share/man/info/en_US/a_doc_lib/cmds/aixcmds4/nl.htm는"그것은는 "참조 NL "명령, 나는 그것이 무엇을 이해하지만, 나는 그것이 전혀 동작하지 않습니다 - 나는, 명령 프롬프트 (는 Win32), 그리고 IDLE에서 실행 시도) (도움말보고,로드 NL라는 이름의 모듈을 검색하려고 - 나는 그것을보고 있지 않다 ... –

+0

@Nascent_Notes : 윈도우에는'nl' 명령이 없습니다 승리 (32) 말에 질문을 업데이트하시기 바랍니다. –

관련 문제