2015-05-07 3 views
0

У меня странное требование. Я не могу установить (или компилировать) модуль python-fabric на машине (на рабочем месте). Мне было интересно. Можно ли скопировать весь исходный код ткани в виде одного файла и вставить в мой файл (что-то вроде «слияния sqlite»)? Это работает ?Возможно ли заменить команду импорта python?

-> Получить источник модуля ткани. -> Скопировать содержимое всех файлов этого модуля в файл (singlefile.py) -> Теперь импортируйте этот файл singlefile.py в myfile.py

Любые мысли? (Предположим, что такие зависимости, как paramiko, pycrypto уже доступны на рабочем месте).

+1

Если модуль должен быть _компилирован, как в компиляторе C, то это определенно не сработает. Но я думал, что Fabric был чистым Python, поэтому я не уверен, почему у этой проблемы есть проблемы. – abarnert

+1

Почему бы вам не включить его в структуру вашей программы? –

+1

Нет; вы ** не можете ** заменить заявления. –

ответ

1

Если в библиотеке есть C-расширения, определенно нет способа сделать это.

Если нет, то технически возможно, но практически нет.

Что вы почти наверняка хотите сделать, это использовать virtualenv или, если вы не можете этого сделать, пакеты сайтов-пользователей вместо системных сайтов-пакетов или какой-либо другой способ обойти «может», t install "и просто установите его.


Но если вы заинтересованы в технических бит ...

Если были ткань, скажем, один .py файла, который будет легко. Но, глядя на the source, у него много файлов. И они организованы в иерархию, а не только в плоский каталог. И есть нетривиальный setup.py, который обычно означает, что он заканчивается установленным, не таким же образом, как в исходном дереве.

Таким образом, чтобы сделать эту работу, то, что вам нужно сделать, это:

  • Делают «развитие» установить в исходном дереве.
  • Возьмите каждый файл, который будет установлен, и заверните его источник в гигантскую строку (первая обратная косая черта - избегайте любых тройных кавычек); а затем функция, которая compiles, что строка, exec s в новом globals dict, строит объект types.ModuleType из этого dict и вставляет его в sys.modules dict; а затем вызов этой функции.
  • Объедините обернутые файлы в порядке обратного топологического сортирования, по которому импортируется файл, который.
  • Встроить результат в начало файла.

только очень сложно, в отличие от утомительной, биты здесь:

  • Модули являются объектами первого класса, с типом с нормальным конструктором и все.
  • import spam всегда ищет sys.modules['spam'] перед поворотом на модуль загрузчика, так что если вы предварительно заполнить, что import будет просто принять его

В теории, это должно работать. Или что-то близко к нему; Возможно, я пропустил деталь. На практике я искренне сомневаюсь, что вы хотите это сделать.

+0

Спасибо abarnert за подробный ответ! Но да, похоже, это действительно утомительная задача. Я действительно сомневаюсь, я могу выполнить эту задачу: p –

Смежные вопросы