2

I'm making a program in pyqt4, using python3.4 and host on Gitlab. When I'm trying to make a build this fails. This is the .gitlab-ci.yml file form my project:

 before_script:
     - apt-get update -qy
     - apt-get install -y python3 python3-dev python3-pip python3-pyqt4
     - export DISPLAY=:0.0

test:
    script:
        - python3 main.py

The error is: main.py: cannot connect to X server: 0.0. I am trying without export DISPLAY=:0.0 and nothing

INDRAJITH EKANAYAKE
  • 3,894
  • 11
  • 41
  • 63
Reinier Hernández
  • 428
  • 1
  • 6
  • 22
  • That error means you do not have a graphical environment running. It would be helpful if we could see the python script (or parts of it) to help you with this further. – sajattack Jun 09 '16 at 18:36
  • It looks like this thread addresses your issue: http://stackoverflow.com/questions/13215120/how-do-i-make-python-qt-and-webkit-work-on-a-headless-server – sajattack Jun 09 '16 at 18:40
  • The code can you find [here](https://github.com/ragnarok22/encriptednetwork) – Reinier Hernández Jun 09 '16 at 19:37

3 Answers3

3

If PyQt5 is an option, Qt 5 has the "minimal" platform plugin. To use it, modify the argv passed to QApplication to include ['-platform', 'minimal'].

(reference: https://stackoverflow.com/a/35355906/829568)

For PyQt4, you could use a virtual X Server:

sudo apt-get install xvfb
xvfb-run python render.py

(reference: https://stackoverflow.com/a/13215192/829568)

Community
  • 1
  • 1
Heinzi
  • 5,793
  • 4
  • 40
  • 69
3

I've tried:

  • include ['-platform', 'minimal'] in sys.argv for QApplication : Failed
  • tried xvfb : Got xvfb-run: error: xauth command not found (even after setting the PATH)

But QT_QPA_PLATFORM: "offscreen" work like a charm and saved the day.

example:

pytest:
  image: python:3.6
  variables:
    QT_QPA_PLATFORM: "offscreen"
  script:
    - pytest tests/

Thanks to steve

azzamsa
  • 1,805
  • 2
  • 20
  • 28
0

Would like to suggest an alternative answer to azzamasa's

  1. Using pytest with pytest-qt, add a pytest option (preferably in conftest.py) to indicate if the application should show or not:

    def pytest_addoption(parser):
        parser.addoption('--show-gui', action='store_true')
    
  2. Use qapp_args fixture to provide the needed arguments -platform offscreen:

    @pytest.fixture(scope="session")
    def qapp_args(show_gui: bool):
        if not show_gui:
            empty_arg_stands_for_exe_path = ''
            return [empty_arg_stands_for_exe_path, '-platform', 'offscreen']
        return []
    
Tzah Mazuz
  • 39
  • 1
  • 6