这是我现在正在研究的python - 我没有列出所有这些代码,所以如果你需要的东西是“缺失”,我道歉 - 我想我可以解释得很好而没有其余的它...
下面是一个函数main()
- 这在我的脚本中没有明确定义 - 它是从其他人制作的另一个脚本中导入的。当它被调用时,它输出一个很长的列表,列出了每个可用的模块python可以调用。我正在尝试为每个模块添加行号。因此,当它输出时,它是一个非常长的模块名称列表(我假设函数main()
在每个模块之后放置“\ n”,因为它打印一个模块,然后是新行,然后是另一个模块名称)。我正在尝试做的是获取这些值,并在每个模块名称前面添加一个行号。
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 :(得分: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__
答案 1 :(得分:0)
我建议重构list_all_mods()
,如果可能的话。特别是,更改它以返回值列表,而不是打印它们;或将其转换为返回列表的新函数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)
p.s。,我不确定什么算作“所有模块”给你,但如果它是当前导入的模块,你可以通过查看sys.modules.keys()
得到这个。
答案 2 :(得分: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
这将起作用,不需要修改原始程序。