Невозможно скомпилировать исходный код Dropbox, даже если pygtk установлен в Arch Linux

Ну, вы могли бы просто извлечь в подкаталог без условий и избавиться от него, если он содержит только один элемент.

Но зачем идти на здравое и простое решение (любезно предоставленное ilkkachu), если можно использовать awk? :)

sunzip ()
{
    if [ $# -ne 1 ] || ! [ -f "$1" ]
    then
        printf '%s\n' "Expected a filename as the first (and only) argument. Aborting."
        return 1
    fi

    extract_dir="."

    # Strip the leading and trailing information about the zip file (leaving
    # only the lines with filenames), then check to make sure *all* filenames
    # contain a /.
    # If any file doesn't contain a / (i.e. is not located in a directory or is
    # a directory itself), exit with a failure code to trigger creating a new
    # directory for the extraction.
    if ! unzip -l "$1" | tail -n +4 | head -n -2 | awk 'BEGIN {lastprefix = ""} {if (match($4, /[^/]+/)) {prefix=substr($4, RSTART, RLENGTH); if (lastprefix != "" && prefix != lastprefix) {exit 1}; lastprefix=prefix}}'
    then
        extract_dir="${1%.zip}"
    fi

    unzip -d "$extract_dir" "$1"
}

Quick'n'dirty. Работает с unzip v6.0 от InfoZIP.
Вы можете адаптировать его под свои нужды, например, принимать или автоматически использовать дополнительные параметры для unzip, или использовать другое имя для подкаталога извлечения (которое в настоящее время определяется по имени файла zip).


О, и я только что заметил, что это обходное решение правильно справляется с двумя наиболее распространенными ситуациями (1. ZIP-файл содержит один каталог с содержимым, 2. ZIP-файл содержит множество отдельных файлов и/или каталогов), но не создает подкаталог, когда корень ZIP-файла содержит несколько каталогов, но без файлов...

Edit: Fixed. Сценарий awk теперь сохраняет первый компонент ("префикс") каждого пути, содержащегося в ZIP-файле, и прерывается, как только обнаруживает префикс, отличающийся от предыдущего. Это позволяет перехватывать как несколько файлов, так и несколько каталогов (поскольку и те, и другие могут иметь разные имена), игнорируя при этом ZIP-файлы, в которых все содержится в одном подкаталоге.

2
22.02.2017, 00:50
5 ответов

Посмотрите config.log , он содержит подробную расшифровку того, что configure запущен. Таким образом, вы получите подробную информацию о «проверке на pygtk»… и подробности «нет». Последние несколько строк относятся к делу; проблема начинается после строки, содержащей «проверка на pygtk».

Обычно содержимого config.log достаточно для понимания проблемы. Если это не так, добавьте это к своему вопросу.

0
27.01.2020, 21:59

Мне удалось частично решить проблему, поскольку вы сказали, что configureвызывает Python 3, а не Python 2.

Просто перейдите в папку с двоичными файлами cd /usr/binи измените символическую ссылку с Python 3 на Python 2, сохранив резервную копию для восстановления после завершения установки:

sudo mv python python.old
sudo ln -s python2.7 python

Затем вы можете вернуться в папку с пакетом и запустить makeдля создания Dropbox. Когда вы закончите, вы должны вернуть символическую ссылку на Python 3, иначе у вас возникнут проблемы с вашей системой:

cd /usr/bin
sudo mv python.old python

Теперь вам нужно сообщить приложению Dropbox, чтобы оно не переходило по символической ссылке /usr/bin/python, а вместо этого переходило по уже существующей символической ссылке /usr/bin/python2. Для этого просто откройте файл /usr/bin/dropboxв своем любимом текстовом редакторе (, используйте sudo, иначе вы не сможете редактировать его )и измените первую строку с #!/usr/bin/pythonна #!/usr/bin/python2.

Теперь вы сможете запустить API Dropbox, набрав dropbox startбез каких-либо проблем с совместимостью.

1
27.01.2020, 21:59

Недавно я столкнулся с этим и обнаружил, (помимо того, что было предложено в предыдущих ответах ), что скрипт configure пытается импортировать модуль gtk , а не pygtk , как можно было ожидать.

$as_echo_n "checking for pygtk... " >&6; }

cat <<EOF | python
try:
 import gtk
except:
 exit(1)
else:

Обходной путь: заменить de gtk на pygtk в этой строке

sed -i 's/ gtk/ pygtk/g' nautilus-dropbox-2.10.0/configure

Я знаю, что это не та же версия пакета, что и в исходном вопросе, но поскольку сообщение об ошибке такое же, это может быть полезно для тех, кто направлен на тот же вопрос.

0
27.01.2020, 21:59

Я столкнулся с той же проблемой, изменение символической ссылки с точки pythonна python2.7не сработало для меня.

Мне помогло запустить следующую команду, чтобы заменить все вхождения pythonна python2в каждом файле в папке nautilus-dropbox-2.10.0:

grep -rl python. | xargs sed -i 's/python/python2/g'

После этого я как обычно выполнил команды configure, makeи make install.

2
27.01.2020, 21:59

Я нашел эту статью во время сборки Dropbox(https://linux.dropbox.com/packages/nautilus-dropbox-2.10.0.tar.bz2)на удаленной машине с CentOS 7.

Хотя я установил pygtk с помощью yum install pygtk2 pygtk2 -devel, команда./configure по-прежнему завершается с оператором:

checking for pygtk... no
configure: error: couldn't find pygtk

Открытие командной строки python и ручной импорт gtk показывает, почему:

[user@computer ~]# python
Python 2.7.5 (default, Jun 20 2019, 20:27:34) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py", line 64, in <module>
    _init()
  File "/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py", line 52, in _init
    _gtk.init_check()
RuntimeError: could not open display
>>> 

Похоже, что для импорта gtk требуется допустимый набор DISPLAY.

Запуск сеанса ssh -с пересылкой -x (X11 -)заставляет эту часть работать.

0
27.01.2020, 21:59

Теги

Похожие вопросы