pip install со случайным временным каталогом - PullRequest
1 голос
/ 18 марта 2020

Когда я использую «pip install» для установки пакетов, путь случайного временного каталога будет записан в файле py c. Как я могу устранить эту случайную разницу? (как указано ниже 2b2_9obo )

# uncompyle6 tools.cpython-37.pyc | head -n6

# uncompyle6 version 3.6.4
# Python bytecode 3.7 (3394)
# Decompiled from: Python 3.7.3 (default, Mar  6 2020, 14:23:55)
# [GCC 4.8.5]
# Embedded file name: /tmp/pip-unpacked-wheel-2b2_9obo/diffoscope/tools.py
# Size of source mod 2**32: 4106 bytes

1 Ответ

0 голосов
/ 06 апреля 2020

Вероятно, есть способ использовать обычный старый POSIX sed в байт-коде, и это сработает, если имена файлов не появятся в коде, кроме поля co_filename объекта кода.

Однако, если вы хотите более пуленепробиваемое решение, вот как вы можете изменить байт-код и записать его обратно.

#!/usr/bin python
"""
Renames the co_filename object
"""
import glob, re, types
import os.path as osp
from xasm.misc import write_pycfile
from xasm.assemble import Assembler
from xdis.code import iscode
from xdis.load import load_module
from collections import deque

def change_co_filename(code, new_path):
    return types.CodeType(
        code.co_argcount,
        code.co_kwonlyargcount,
        code.co_nlocals,
        code.co_stacksize,
        code.co_flags,
        code.co_code,
        code.co_consts,
        code.co_names,
        code.co_varnames,
        new_path,
        code.co_name,
        code.co_firstlineno,
        code.co_lnotab,
        code.co_freevars,
        code.co_cellvars)

def disco_loop(queue, new_path):
    new_code = change_co_filename(queue[0], new_path)
    while len(queue) > 0:
        co = queue.popleft()
        for c in co.co_consts:
            if iscode(c):
                change_co_filename(c, new_path)
                queue.append(c)
            pass
        pass
    return new_code


suffix = "cpython-3.7.pyc"
paths = glob.glob(f"*.{suffix}")


# Modify to figure out what prefix to look for
orig_dirname = "/tmp/pip-unpacked-wheel-2b2_9obo/"
new_dirname = "/tmp/"

for path in paths:
    assembler = Assembler("3.7")
    version, assembler.timestamp, magic_int, code, is_pypy, assembler.size = load_module(path)
    new_path = re.sub(orig_dirname, new_dirname, code.co_filename)
    queue = deque([code])
    new_code = disco_loop(queue, new_path)
    assembler.code_list = [new_code]
    write_pycfile(path, assembler)

Это зависит от моего xdis и xasm программы, работающие с байт-кодом. (Мне только что пришлось модифицировать последний для 3.7, так как объект кода изменился в этой версии)

Если есть интерес к такого рода вещам, я, вероятно, могу модифицировать вышеупомянутое как отдельную подпрограмму и распространять это с xasm.

Если вы хотите узнать, что происходит при записи Python файлов байт-кода, см. ответ здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...