You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

虚拟环境中自定义库访问外部文件遇权限问题,求解决方案

解决自定义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文件。

最后验证步骤

  1. 先删除旧的安装包:pip uninstall aiautotest
  2. 重新打包:python setup.py bdist_egg
  3. 重新安装:python setup.py install
  4. 运行你的测试代码,检查adb是否能正常调用。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:00:11