如何在cmake中在当前目录的所有子目录中生成__init__.py?

mw3dktmi  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(132)

我使用CMake的out-of-tree构建。我有一个CMake自定义命令,它从proto-files生成 *pb2.py文件。由于proto-files可能驻留在未知数量的子目录(包命名空间)中,如$SRC/package1/package2/file.proto,那么构建目录将包含类似$BLD/package1/package2/file_pb2.py的内容。
我想从自动生成的 *pb2.py文件隐式生成包,因此,我想在所有子文件夹($BLD/package1$BLD/package1/package2等)中自动生成__init
.py文件,然后安装它们。
我怎么能那样做呢?

0ejtzxu1

0ejtzxu11#

如果您在 *NIX操作系统(包括mac)下工作,您可以使用shell find命令,如下所示:

ROOT="./"
for DIR in $(find $ROOT -type d); do
    touch $DIR/__init__.py
done

或使用python脚本:

from os.path import isdir, walk, join

root = "/path/to/project"
finit = '__init__.py'
def visitor(arg, dirname, fnames):
    fnames = [fname for fname in fnames if isdir(fname)]
    # here you could do some additional checks ...
    print "adding %s to : %s" %(finit, dirname)
    with open(join(dirname, finit), 'w') as file_: file_.write('')

walk(root, visitor, None)
u5rb5r59

u5rb5r592#

以下内容应给予变量AllPaths中所需的目录列表:

# Get paths to all .py files (relative to build dir)
file(GLOB_RECURSE SubDirs RELATIVE ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}/*.py")
# Clear the variable AllPaths ready to take the list of results
set(AllPaths)
foreach(SubDir ${SubDirs})
  # Strip the filename from the path
  get_filename_component(SubDir ${SubDir} PATH)
  # Change the path to a semi-colon separated list
  string(REPLACE "/" ";" PathParts ${SubDir})
  # Incrementally rebuild path, appending each partial path to list of results
  set(RebuiltPath ${CMAKE_BINARY_DIR})
  foreach(PathPart ${PathParts})
    set(RebuiltPath "${RebuiltPath}/${PathPart}")
    set(AllPaths ${AllPaths} ${RebuiltPath})
  endforeach()
endforeach()
# Remove duplicates
list(REMOVE_DUPLICATES AllPaths)
xbp102n0

xbp102n03#

下面是https://stackoverflow.com/a/11449316/827437中另一个答案的一行版本:
find $DIR -type d -exec touch {}/__init__.py \;
这将通过执行touch命令在$DIR的每个目录中创建一个__init__.py文件。运行find $DIR -type d查看将包含该文件的目录。

相关问题