虚拟环境中自定义库访问外部文件遇权限问题,求解决方案
解决自定义Python库访问外部静态文件(adb)的权限与路径问题
我来帮你拆解下这个问题,核心是两个关键点:打包时静态文件的正确配置和运行时文件路径与权限的处理,咱们一步步解决:
1. 修复setup.py的静态文件打包配置
你当前的package_data配置只匹配了static目录下的直接文件,没有递归包含adb/mac子目录里的adb二进制文件,导致打包安装后这个文件可能没被正确放到site-packages的库目录里。
修改setup.py的package_data部分,使用递归通配符来包含所有子目录文件:
from setuptools import find_packages, setup setup( name='aiautotest', version='1.0', packages=find_packages(), package_data={ 'aiautotest': ["config/*"], # 用**/*递归匹配static下所有子目录的文件 'airtest': ["report/*", "core/android/static/**/*"] }, # 确保setuptools能识别递归通配符 include_package_data=True, entry_points=""" [console_scripts] aiautotest = aiautotest.__main__:main """, )
另外,建议添加一个MANIFEST.in文件到项目根目录,明确告诉打包工具要包含这些静态文件,避免遗漏:
# MANIFEST.in recursive-include airtest/core/android/static * recursive-include aiautotest/config * recursive-include airtest/report *
2. 确保adb文件的可执行权限
错误提示的PermissionError说明adb文件没有可执行权限,可能是打包前没设置,或者安装后权限丢失了。
方法一:打包前手动设置权限
在项目目录下执行命令给adb加可执行权限:
chmod +x /Users/xmly/PycharmProjects/aiautotest/airtest/core/android/static/adb/mac/adb
然后重新打包安装:
python setup.py bdist_egg python setup.py install
方法二:在setup.py中自动设置权限
如果需要自动化处理,可以添加一个安装后脚本,在安装完成后给adb文件加权限:
from setuptools import find_packages, setup import os from setuptools.command.install import install class PostInstallCommand(install): def run(self): install.run(self) # 获取安装后的adb路径 adb_path = os.path.join(self.install_lib, 'airtest/core/android/static/adb/mac/adb') # 添加可执行权限 os.chmod(adb_path, 0o755) setup( name='aiautotest', version='1.0', packages=find_packages(), package_data={ 'aiautotest': ["config/*"], 'airtest': ["report/*", "core/android/static/**/*"] }, include_package_data=True, cmdclass={'install': PostInstallCommand}, entry_points=""" [console_scripts] aiautotest = aiautotest.__main__:main """, )
3. 代码中不要硬编码文件路径
你代码里用了硬编码的/Users/xmly/PycharmProjects/aiautotest/...路径,这在安装到虚拟环境后肯定是无效的,必须用Python的包资源工具来动态获取文件路径。
修改airtest/core/android/adb.py里获取adb路径的代码,改用pkg_resources(兼容Python3.7+):
import pkg_resources # 获取包内adb文件的真实路径 adb_path = pkg_resources.resource_filename('airtest', 'core/android/static/adb/mac/adb') # 然后用这个路径来执行命令
或者用更现代的importlib.resources(Python3.7+支持):
from importlib.resources import files adb_path = files('airtest').joinpath('core/android/static/adb/mac/adb') adb_path_str = str(adb_path)
这样不管你的库安装到哪个路径,都能正确找到adb文件。
最后验证步骤
- 先删除旧的安装包:
pip uninstall aiautotest - 重新打包:
python setup.py bdist_egg - 重新安装:
python setup.py install - 运行你的测试代码,检查adb是否能正常调用。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

