在 PEX 文件上创建入口点的问题

问题描述

我目前正在尝试使用 Pythonfile 入口点创建 pex 文件

我的文件夹结构如下所示:

├── readme.md
├── requirements.txt
├── setup.py
├── stv
│   ├── adminuser.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── adminuser.cpython-39.pyc
│   │   ├── __init__.cpython-39.pyc
│   │   ├── sequenceGenerator.cpython-39.pyc
│   │   ├── servicetracevisualizer.cpython-39.pyc
│   │   └── traceloader.cpython-39.pyc
│   ├── sequenceGenerator.py
│   ├── servicetracevisualizer.py
│   └── traceloader.py
└── stvcli.py

所以我尝试为所有文件制作一个 pex 文件,然后我通过解压缩来验证这些文件以保存所有文件

我的问题是我无法设置此文件的入口点:

stvcli.py

这里是 stvcli.py 的实现:

import argparse
import logging
from stv import servicetracevisualizer
import os
import sys
    
#print args
parser = argparse.ArgumentParser(description='Service Trace Visualizer interface.')

parser.add_argument('--renderurls',dest="renderurls",action="store_true",help='do not try to render operations basend on mapping-table but print urls directly [True,False (default)]')
parser.add_argument('--includeuseless',dest="includeuseless",help='include insignificant requests from sequence chart (e.g. successful Unified Auth) [True,False (default)]')
parser.add_argument('--outfolder',Metavar='outfolder',type=str,help='folder for saving resulting files (default is folder of inputfile)')
parser.add_argument('--loglevel',Metavar='loglevel',default="INFO",help='select loglevel: [CRITICAL,ERROR,WARNING,INFO (default),DEBUG,NOTSET]')
parser.add_argument('--filename',Metavar='filename',required=True,help='input filename')

args = parser.parse_args()
    
#set args
renderOperations = not args.renderurls
removeUseless = not args.includeuseless
filename = args.filename
if args.outfolder is None:
    outfolder = os.path.dirname(filename)
else:
    outfolder = args.outfolder
loglevel = logging._nametoLevel[args.loglevel]

#add trailing "/" to outpath
if outfolder[:-1] != "/":
    outfolder = outfolder + "/"
#create dirs if outpath does not exist
if not os.path.exists(outfolder):
    os.makedirs(outfolder)

#initialize logger
logging.basicConfig(level=loglevel,filename = outfolder + os.path.basename(filename)+".log")
log = logging.getLogger(__name__)
try:
    log.info("init stv")
    stv = servicetracevisualizer.serviceTraceVisualizer(renderOperations=renderOperations,removeUseless=removeUseless,outfolder=outfolder)
    log.info("render file " + filename)
    exitcode = stv.renderFile(filename)
except Exception as e:
    log.error(e)
    exitcode = 100 #Todo custom Error codes
log.info("exitcode " + str(exitcode))
sys.exit(exitcode)

我使用 stvcli.py 创建 PEX 文件的尝试如下:

pex -e stvcli:stvcli -r requirements.txt -o stvcli.pex

但是在启动时它只给我一个 ModuleNotFoundError: No module named 'stvcli',当 stvcli 明显存在时!

如何将 Python 文件设为入口点? 如果您有任何问题,我会立即回答!

解决方法

我找到了问题的答案!

要在 pex 文件上设置 .py 文件的入口点,请使用 -c 命令!

e.g. pex . -r requirements.txt -c main.py -o test.pex

官方文档真的很复杂很笨重!

这是一个博客,其中详细描述了成功创建 pex 文件所需的步骤!

https://www.shearn89.com/2021/04/15/pex-file-creation

这对我帮助很大,我希望这对您也有帮助!