Не удалось установить Twisted [duplicate]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа прекращает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

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

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

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

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

768
задан Chris 3 February 2014 в 17:16
поделиться

25 ответов

Мне удалось решить эту проблему и сгенерировать файл .so в одной команде

gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7  utilsmodule.c
11
ответ дан Solomon Ucko 17 August 2018 в 22:56
поделиться

попробуйте apt-файл. Трудно запомнить имя пакета, в котором находится отсутствующий файл. Он является общим и полезным для любых файлов пакетов.

Например:

root@ubuntu234:~/auto# apt-file search --regexp '/Python.h$'
pypy-dev: /usr/lib/pypy/include/Python.h
python2.7-dbg: /usr/include/python2.7_d/Python.h
python2.7-dev: /usr/include/python2.7/Python.h
python3.2-dbg: /usr/include/python3.2dmu/Python.h
python3.2-dev: /usr/include/python3.2mu/Python.h
root@ubuntu234:~/auto# 

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

9
ответ дан Aleksandr M 17 August 2018 в 22:56
поделиться

Эта ошибка возникла, когда я попытался установить ctds на CentOS 7 с Python3.6. Я сделал все трюки, упомянутые здесь, включая yum install python34-devel. Проблема была Python.h найдена в /usr/include/python3.4m but not in /usr/include/python3.6m. Я попытался использовать --global-option для указания на включение dir (pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds). Это привело к тому, что при связывании ctds не удалось найти lpython3.6m.

Наконец, что нужно было исправить, чтобы среда разработки для Python3.6 исправлялась с помощью include и libs.

yum -y install https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/python36u-libs-3.6.3-1.ius.centos7.x86_64.rpm

Python.h должен быть включен в ваш путь include для gcc. Какая бы версия python не использовалась, например, если она равна 3,6, то она должна быть в /usr/include/python3.6m/Python.h как правило.

4
ответ дан Babu Arunachalam 17 August 2018 в 22:56
поделиться
  • 1
    Не знаю, почему есть -1, но это проблема на сегодняшний день для python3.6 с CentOS, поскольку python36-devel недоступен. Вам нужно будет установить его по указанному выше URL-адресу. – Babu Arunachalam 16 November 2017 в 03:25

Я также столкнулся с этой ошибкой, когда устанавливал coolprop в ubuntu.

Для ubuntu 16.04 с python 3.6

sudo apt-get install python3.6-dev

Если это не работает, попробуйте установить / обновить gcc lib.

sudo apt-get install gcc
6
ответ дан bwaaaaaa 17 August 2018 в 22:56
поделиться

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

sudo apt-get install python2.6-dev 
sudo apt-get install python2.7-dev 
etc.
25
ответ дан Christian Long 17 August 2018 в 22:56
поделиться
  • 1
    Вы имели в виду python2.6-dev, python2.7-dev, python{version}-dev – Philip Ramirez 28 April 2015 в 06:52
  • 2
    Спасибо за исправление. Я отредактировал свой ответ. – Christian Long 28 April 2015 в 18:13

Я хотел бы добавить также решение для Cygwin :

Вам нужно установить пакет python2-devel или python3-devel, в зависимости от версии Python, которую вы с помощью.

Вы можете быстро установить его с помощью 32-битного или 64-битного setup.exe (в зависимости от вашей установки) из Cygwin. com .

Пример (измените имя файла setup.exe и основную версию Python, если вам нужно):

$ setup.exe -q --packages=python3-devel

Вы также можете проверить мои другие answer еще несколько вариантов установки пакетов Cygwin из командной строки.

20
ответ дан Dawid Ferenczy 17 August 2018 в 22:56
поделиться

Похоже, что вы неправильно установили файлы заголовков и статические библиотеки для python dev. Используйте диспетчер пакетов, чтобы установить их в системном масштабе.

Для apt (Ubuntu, Debian ...):

sudo apt-get install python-dev   # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Для yum (CentOS, RHEL ...):

sudo yum install python-devel   # for python2.x installs
sudo yum install python34-devel   # for python3.4 installs

Для dnf (Fedora ...):

sudo dnf install python2-devel  # for python2.x installs
sudo dnf install python3-devel  # for python3.x installs

Для zypper (openSUSE ...):

sudo zypper in python-devel   # for python2.x installs
sudo zypper in python3-devel  # for python3.x installs

Для apk ( Alpine ...):

# This is a departure from the normal Alpine naming
# scheme, which uses py2- and py3- prefixes
sudo apk add python2-dev  # for python2.x installs
sudo apk add python3-dev  # for python3.x installs
1391
ответ дан detuur 17 August 2018 в 22:56
поделиться
  • 1
    Это сработало для меня. Ubuntu 14.04, Python 2.7, получил ошибку при установке psycopg2 и «sudo apt-get install python-dev & quot; разрешили ошибку. – Steve Saporta 18 July 2014 в 14:44
  • 2
    Работает на Raspbian – Thijs 25 October 2014 в 17:51
  • 3
    для opensuse, install & quot; python3-devel & quot; – kmonsoor 29 March 2015 в 08:17
  • 4
    для centos yum install python-devel – Kaushik 14 April 2015 в 13:41
  • 5
    Попробуйте locate Python.h и посмотрите, есть ли у вас файл, прежде чем делать все это. Если вы найдете найденный файл, в основном этот ответ будет работать: stackoverflow.com/a/19344978/4954434 (Это может быть просто проблема с пути) – Jithin Pavithran 25 January 2017 в 17:44
  • 6
  • 7

Он часто появляется, когда вы пытаетесь удалить python3.5 и установить python3.6.

Таким образом, при использовании python3 (который python3 -V => python3.6) для установки некоторых необходимых пакетов python3.5 появится эта ошибка.

Разрешить установкой модуля python3.6-dev.

2
ответ дан dphans 17 August 2018 в 22:56
поделиться

На Ubuntu я запускал Python 3, и мне пришлось установить

sudo apt-get install python3-dev

. Если вы хотите использовать версию Python, которая не связана с python3, установите связанный python3.x-dev пакет. Например:

sudo apt-get install python3.5-dev
230
ответ дан FreshPow 17 August 2018 в 22:56
поделиться
  • 1
    Я выполнил команду sudo apt-get install python3.4-dev для моего Python3.4, и это решило мою проблему. – Aaron Lelevier 8 September 2014 в 14:40
  • 2
    Это устарело, используйте 3.4. – AlexLordThorsen 29 December 2014 в 01:59
  • 3
    @Rawrgulmuffins хорошо зависит от того, какую версию python вы используете. В моем случае sudo apt-get install python2.7-dev исправлена ​​проблема – RockScience 30 December 2014 в 10:09
  • 4
    @RockScience ах, спасибо за исправление. – AlexLordThorsen 30 December 2014 в 11:02
  • 5
    Я добавлю еще одну вещь к этому ответу - если у вас несколько версий Python 3.x, python3-dev установит зависимости для этой версии, которые связаны с командой python3. Итак, если вы хотите установить определенную версию, используйте полную версию, например - python3.x-dev. – xyres 25 December 2017 в 17:12
  • 6
    – codestruggle 27 February 2018 в 15:44
  • 7
    – SuperShoot 2 March 2018 в 06:32

Если вы используете virtualenv с 3.6 python (край сейчас), обязательно установите соответствующий python 3.6 dev sudo apt-get install python3.6-dev, в противном случае выполнение sudo python3-dev установит python dev 3.3.3-1, t решить проблему.

12
ответ дан Guillaume Cisco 17 August 2018 в 22:56
поделиться
  • 1
    Отлично работал для меня на 3.5 (.2). Явная установка правильного пакета dev для вашей версии Python - это хорошая вещь. – Seth 29 May 2017 в 13:52

Иногда даже после установки python-dev ошибка сохраняется. Проверьте наличие ошибки, если она отсутствует.

Сначала загрузите, как указано в https://stackoverflow.com/a / 21530768/8687063 , затем установите gcc

Для apt (Ubuntu, Debian ...):

sudo apt-get install gcc

Для yum (CentOS, RHEL ...) :

sudo yum install gcc

Для dnf (Fedora ...):

sudo dnf install gcc

Для zypper (openSUSE ...):

sudo zypper in gcc

Для apk (Alpine ...):

sudo apk gcc
1
ответ дан HimanshuGahlot 17 August 2018 в 22:56
поделиться

Конечно, python-dev или libpython-all-dev - это первое, что нужно (apt) install, но если это не помогло, как и в моем случае, я советую вам установить внешний интерфейс / g0] пакетами sudo apt-get install libffi-dev и sudo pip install cffi.

Это должно помочь, особенно если вы видите ошибку как / из c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory.

3
ответ дан Huge 17 August 2018 в 22:56
поделиться

Это не такая же ситуация, но она также работает для меня, и теперь я могу использовать SWIG с Python3.5:

Я пытался скомпилировать:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/

С Python 2.7 работает отлично, а не с моей версией 3.5:

existe_wrap.c: 147: 21: фатальная ошибка: Python.h: нет существующей команды el archio завершена.

После запуска в моей установке Ubuntu 16.04:

sudo apt-get install python3-dev  # for python3.x installs

Теперь я могу скомпилировать без проблем Python3.5:

gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
9
ответ дан Hugo L.M 17 August 2018 в 22:56
поделиться

Если вы используете малину Pi:

sudo apt-get install python-dev
44
ответ дан josliber 17 August 2018 в 22:56
поделиться
  • 1
    Я не делаю то, что использовал OP, но я использую малину Pi - и у меня была эта ошибка, тогда я сделал то, что вы сказали, а затем ошибка исчезла. Благодаря ! – monojohnny 5 January 2016 в 23:29
  • 2
    Это работает для любого дистрибутива на основе apt :) +1 – max 24 March 2016 в 17:49

Для товарищей OpenSuse:

sudo zypper install python3-devel
8
ответ дан kmonsoor 17 August 2018 в 22:56
поделиться

Это означает, что Python.h отсутствует в ваших путях включения по умолчанию вашего компилятора. Установили ли вы его как в системе, так и локально? Какова ваша ОС?

Вы можете использовать флаг -I<path>, чтобы указать дополнительный каталог, в котором ваш компилятор должен искать заголовки. Вам, вероятно, придется следить за -L<path>, чтобы gcc мог найти библиотеку, с которой вы будете связываться, используя -l<name>.

1
ответ дан Kos 17 August 2018 в 22:56
поделиться

в Fedora запускает это для Python 2:

sudo dnf install python2-devel

и для Python 3:

sudo dnf install python3-devel
31
ответ дан Martin Tournoij 17 August 2018 в 22:56
поделиться
  • 1
    Моя CentOS успешно применяет эту команду – Gary Gauh 21 August 2015 в 09:02
  • 2
    На монетном дворе 18.2 (на основе Ubuntu) это было apt-get install python-dev. – Deleet 31 August 2017 в 15:59

В моем случае, что исправлено в Ubuntu, было установить пакеты libpython-all-dev (или libpython3-all-dev, если вы используете Python 3).

12
ответ дан Oriol Nieto 17 August 2018 в 22:56
поделиться
  • 1
    python-all-dev в моем случае, но достаточно близко. – Dave S. 31 May 2016 в 19:07
  • 2
    @Oriol Nieto, Большое спасибо. python-all-dev также решила проблему для меня. – shrawan_lakhe 22 February 2017 в 15:17

AWS EC2 устанавливает запуск python34:

sudo yum install python34-devel

14
ответ дан orsonady 17 August 2018 в 22:56
поделиться

Для CentOS 7:

sudo yum install python36u-devel

Я выполнил инструкции для установки python3.6 на нескольких виртуальных машинах: https://www.digitalocean.com/community/tutorials/how- to-install-python-3-and-setup-a-local-programming-environment-on-centos-7 , а затем смог построить mod_wsgi и заставить его работать с python3.6 virtualenv

8
ответ дан Paul Roub 17 August 2018 в 22:56
поделиться

Для меня это изменилось:

#include <python2.7/Python.h>

Я нашел файл /usr/include/python2.7/Python.h, а поскольку /usr/include уже находится в пути включения, тогда python2.7/Python.h должно быть достаточно.

Вместо этого вы можете добавить путь include из командной строки - gcc -I/usr/lib/python2.7 (спасибо @ erm3nda).

18
ответ дан sashoalm 17 August 2018 в 22:56
поделиться
  • 1
    Все остальные ответы говорят вам что-то установить. Этот работал для меня. Почему это не лучший ответ? – noɥʇʎԀʎzɐɹƆ 8 August 2016 в 16:20
  • 2
    @ uoɥʇʎPʎzɐɹC Возможно, потому что он не будет работать под python3? – Louis 31 August 2016 в 06:44
  • 3
    Лучше установить lib на gcc -I/usr/lib/python2.7 etc, а не жестко кодировать вызовы include. – erm3nda 29 March 2017 в 02:31
  • 4
    @ noɥʇʎԀʎzɐɹƆ Потому что он должен работать без изменения кода. Вам часто приходится компилировать код, не принадлежащий вам, например, внешнюю зависимость, и самое худшее, что вы можете сделать, это изменить этот код. – Dawid Ferenczy 19 April 2017 в 12:38
  • 5
    @DawidFerenczy Понял. – noɥʇʎԀʎzɐɹƆ 19 April 2017 в 21:03

Убедитесь, что файлы разработчика Python поставляются с вашей ОС.

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

$ pkg-config --cflags --libs python2
-I/usr/include/python2.7 -lpython2.7

Вы можете добавить ее в свою строку gcc :

gcc $(pkg-config --cflags --libs python2) -Wall utilsmodule.c -o Utilc
14
ответ дан sleblanc 17 August 2018 в 22:56
поделиться

В AWS API (centOS) его

yum install python27-devel
18
ответ дан Tadeusz Kopec 17 August 2018 в 22:56
поделиться
  • 1
    Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения от автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутации , вы сможете прокомментировать любую запись . – Wtower 9 July 2015 в 07:58
  • 2
    @Wtower Да, это дает ответ. – Tadeusz Kopec 9 July 2015 в 14:28
  • 3
    Это дает ответ. Хотя вам нужно заменить версию на то, что вам нужно. – Ganesh Krishnan 3 August 2015 в 02:45
  • 4
    это помогло преодолеть мои проблемы с попыткой pip install cryptography на экземпляре amazon linux. – Ryan Tuck 7 March 2017 в 00:34
  • 5
    Это был полезный ответ, в то время как на Amazon Linux можно установить python-devel или python2-devel, это единственный, который действительно работал для меня при запуске установки pip внутри virtualenv – Kristofor Carle 18 October 2017 в 02:15

Две вещи, которые вам нужно сделать.

Установить пакет разработки для Python, в случае Debian / Ubuntu / Mint это делается с помощью команды:

sudo apt-get install python-dev

Во-вторых, включить файлы по умолчанию не включены в путь include, а также библиотека Python, связанная с исполняемым файлом по умолчанию. Вам нужно добавить эти флаги (замените версию Python соответственно):

-I/usr/include/python2.7 -lpython2.7 

Другими словами, ваша команда компиляции должна быть:

gcc -Wall -I/usr/include/python2.7 -lpython2.7  utilsmodule.c -o Utilc 
54
ответ дан vartec 17 August 2018 в 22:56
поделиться
  • 1
    мне нужно добавлять флаги для каждого включенного файла в файл расширения C? – Mohanad Y. 4 February 2014 в 10:38
  • 2
    Если вы используете другую версию Python, например, 3.3: sudo apt-get install python3.3-dev – FreshPow 6 August 2014 в 14:07
  • 3
    Я рекомендую использовать pkg-config вместо raw -I: stackoverflow.com/a/21531170/895245 – Ciro Santilli 新疆改造中心 六四事件 法轮功 15 August 2018 в 11:16

Если вы используете Python 3.6 на Amazon Linux (на основе RHEL, но приведенные здесь ответы RHEL не работают):

sudo yum install python36-devel
1
ответ дан Yigal 17 August 2018 в 22:56
поделиться
Другие вопросы по тегам:

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