我坚持构建 sed 表达式,该表达式将解析python文件的导入并提取模块的名称。
这是我使用的一个简单示例(我需要输出为模块名称,而不是' as'或者任何空格......):
from testfunctions import mod1, mod2 as blala, mod3, mod4
到目前为止我所拥有的:
grep -ir "from testfunctions import" */*.py | sed -E s/'\s+as\s+\w+'//g | sed -E s/'from testfunctions import\s+'//g
这确实在上述情况下得到了所需的结果。
问题: 在导入类似的文件中:
from testfunctions import mod1, mod2 as blala, mod3, mod4 \
mod5, mod6 as bla, mod7 \
mod8, mod9 ...
我有什么想法可以改善我的管道表达式以处理多行?
答案 0 :(得分:1)
试试这个;
sed -n -r '/from/,/^\s*$/p;' *.py | sed ':x; /\\$/ { N; s/\\\n//; tx }' | sed 's/^.*.import//g;s/ */ /g'
答案 1 :(得分:1)
感谢大家的帮助。我不知道ast
这样的模块存在。它确实帮助我实现了目标。
我整理了一个我需要的解决方案的简单版本,仅供参考,如果其他人也遇到这个问题:
import glob
import ast
moduleList = []
# get all .py file names
testFiles = glob.glob('*/*.py')
for testFile in testFiles:
with open(testFile) as code:
# ast.parse creates the tree off of plain code
tree = ast.parse(code.read())
# there are better ways to traverse the tree, in this sample there
# is no guarantee to the traversal order
for node in ast.walk(tree):
if isinstance(node, ast.ImportFrom) and node.module == 'testfunctions':
# each node will contain an ast.ImportFrom instance which
# data members are: module, names(list of ast.alias) and level
moduleList.extend([alias.name for alias in node.names])
您可以在此处详细了解相关信息(可能是整个网络中ast
的唯一详细信息页面):https://greentreesnakes.readthedocs.io/en/latest/manipulating.html#inspecting-nodes