python - hæv ValueError ('Navneområde\% s ikke tilgængeligt'\% navneområde) ValueError: Navneområde Gtk ikke tilgængeligt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et lille program på python med python 3.4. Men jeg klarer ikke at få det til at fungere i en .exe ved hjælp af Cx\_freeze på windows.


Jeg får fejlen:


uildexe.win-amd64-3.4>lcp.exe
Traceback (most recent call last):
  File "C:Python34libsite-packagescx\_FreezeinitscriptsConsole.py", line 27, in <module>
    exec(code, m.\_\_dict\_\_)
  File "LCP.py", line 5, in <module>
  File "C:Python34libsite-packagesgi\_\_init\_\_.py", line 118, in require\_version
    raise ValueError('Namespace \%s not available' \% namespace)
ValueError: Namespace Gtk not available


Når du forsøger at køre .exe ved hjælp af cmd som kører det normalt med dobbelt klik, får jeg bare en skærm, der åbner og går ned.


Programmet bruger gi.repository og har denne kode ved tiggeringen:


import  gi
gi.require\_version('Gtk', '3.0')
from    gi.repository   import  Gtk,Gdk


min setup.py er som denne lige nu:


import os
from cx\_Freeze import setup, Executable
import sys
import  gi
gi.require\_version('Gtk', '3.0')
from    gi.repository   import  Gtk,Gdk



build\_exe\_options = { "include\_msvcr": True}

# Frozen executables made by build\_exe need to have everything that GTK
# loads at runtime available under the root where the built .exe goes.

common\_include\_files = []


# On MSYS2's MINGW64/32 enrironments, the DLLs we want are in PATH.
# Typically this means /mingw64/bin/libwhatever.dll.  An alternative way
# of forming the list of required DLLs would be to parse the relevant
# .gir files (see below). However, libpangowin32-1.0-0.dll wouldn't be
# listed.

required\_dll\_search\_paths = os.getenv("PATH", os.defpath).split(os.pathsep)
required\_dlls = [
    'libgtk-3-0.dll',
    'libgdk-3-0.dll',
    'libepoxy-0.dll',
    'libgdk\_pixbuf-2.0-0.dll',
    'libpango-1.0-0.dll',
    'libpangocairo-1.0-0.dll',
    'libpangoft2-1.0-0.dll',
    'libpangowin32-1.0-0.dll',
    'libatk-1.0-0.dll',
]

for dll in required\_dlls:
    dll\_path = None
    for p in required\_dll\_search\_paths:
        p = os.path.join(p, dll)
        if os.path.isfile(p):
            dll\_path = p
            break
    assert dll\_path is not None, 
        "Unable to locate {} in {}".format(
            dll,
            dll\_search\_path,
        )
    common\_include\_files.append((dll\_path, dll))


# We need the .typelib files at runtime.
# The related .gir files are in $PREFIX/share/gir-1.0/$NS.gir,
# but those can be omitted at runtime.

required\_gi\_namespaces = [
    "Gtk-3.0",
    "Gdk-3.0",
    "cairo-1.0",
    "Pango-1.0",
    "GObject-2.0",
    "GLib-2.0",
    "Gio-2.0",
    "GdkPixbuf-2.0",
    "GModule-2.0",
    "Atk-1.0",
]


# Packages that need to be bundled go here.

common\_packages = [
    "gi","gtk-3.0", "Gdk-3.0" # always seems to be needed
    # "cairo",   # Only needed (for foreign structs) if no "import cairo"s
]


ejecutable = Executable(
    script ="LCP.py",

    #compress = True,
    #copyDependenFile = True,
    #appendScriptToExe =True,
    #appendScriptToLibrary = True,
    #icon = "imagen"
    )


includes =['os','gi','gi.overrides']
packages = ['gi', 'os']

include\_files= ['respuestasFrecuentes.txt']     #archivos extra q no sean .py


setup(
        name = 'Respuestas Frecuentes',
        author = 'Irina Marcano',
        version = '0.1.0',
        description = 'facilidad para modificar tus respuestas recientes',
        executables= [ejecutable],
        options = {"build\_exe":{
            "includes": includes,
            "packages": packages,
            "optimize": 2,
            "include\_files": include\_files,
            #"include\_msvcr": include\_msvcr,
        } }
    )


Den setup.py tog mig dage til at gøre som ved tiggeri det havde problemer. Indtil videre kopierer ikke dll'en fra bibliotekerne på mappen. Jeg sidder fast med den fejl, og jeg har ingen idé om, hvad jeg skal gøre nu. Jeg bruger Windows 10, på Windows 8 vil det heller ikke arbejde og give den samme fejl som angivet ved bedring. Åbning af programmet på dens .py fungerer perfekt, åbning selv ved hjælp af python 3.6 arbejder minus nogle få fejl som manglende gi og gtk.


at bemærke, at når jeg bruger python setup.py build, får jeg denne besked:


    Missing modules:
? UserList imported from pygtkcompat.pygtkcompat
? \_\_main\_\_ imported from bdb, pdb
? \_dummy\_threading imported from dummy\_threading
? \_posixsubprocess imported from subprocess
? \_winreg imported from platform
? ce imported from os
? gi.repository.Atk imported from pygtkcompat.pygtkcompat
? gi.repository.GLib imported from gi.overrides.Dee, gi.overrides.GObject, gi.overrides.Gio, pygtkcompat.pygtkcompat
? gi.repository.GObject imported from gi.overrides.GExiv2, gi.overrides.Gedit, gi.overrides.Gtk, gi.overrides.Vips, pygtkcompat.generictreemodel, pygtkcompat.pygtkcompat
? gi.repository.GUdev imported from pygtkcompat.pygtkcompat
? gi.repository.Gdk imported from lcp\_\_main\_\_, pygtkcompat.pygtkcompat
? gi.repository.GdkPixbuf imported from pygtkcompat.pygtkcompat
? gi.repository.GdkX11 imported from gi.overrides.Gdk
? gi.repository.Gio imported from gi.overrides.Ggit, pygtkcompat.pygtkcompat
? gi.repository.GooCanvas imported from pygtkcompat.pygtkcompat
? gi.repository.Gst imported from gi.overrides.GstPbutils, pygtkcompat.pygtkcompat
? gi.repository.GstAudio imported from pygtkcompat.pygtkcompat
? gi.repository.GstBase imported from pygtkcompat.pygtkcompat
? gi.repository.GstController imported from pygtkcompat.pygtkcompat
? gi.repository.GstInterfaces imported from pygtkcompat.pygtkcompat
? gi.repository.GstPbutils imported from pygtkcompat.pygtkcompat
? gi.repository.GstVideo imported from pygtkcompat.pygtkcompat
? gi.repository.Gtk imported from lcp\_\_main\_\_, pygtkcompat.generictreemodel, pygtkcompat.pygtkcompat
? gi.repository.Pango imported from pygtkcompat.pygtkcompat
? gi.repository.PangoCairo imported from pygtkcompat.pygtkcompat
? gi.repository.Poppler imported from pygtkcompat.pygtkcompat
? gi.repository.Vte imported from pygtkcompat.pygtkcompat
? gi.repository.WebKit imported from pygtkcompat.pygtkcompat
? gi.repository.cairo imported from gi.overrides.Gdk
? grp imported from shutil, tarfile
? java.lang imported from platform
? org.python.core imported from copy
? os.path imported from os, pkgutil, py\_compile, shutil, unittest.util
? posix imported from os
? pwd imported from http.server, posixpath, shutil, tarfile, webbrowser
? termios imported from tty
? vms\_lib imported from platform
This is not necessarily a problem - the modules may not be needed on this platform.


Jeg har ingen anelse om, hvordan man fjerner de fleste af dem, da mit program kun bruger gtk og gdk, som jeg har brug for til at få adgang til.

Bedste reference


Jeg havde også dette problem og brugte meget tid på at finde løsningen.



  1. Tilføj dette afsnit til din cx\_freeze s setup.py, der skrev ovenfor:


    for ns in required\_gi\_namespaces:
        subpath = "Libgirepository-1.0{}.typelib".format(ns)
        fullpath = os.path.join(sys.prefix, subpath)
        assert os.path.isfile(fullpath), (
            "Required file {} is missing" .format(
                fullpath,
        ))
        common\_include\_files.append((fullpath, subpath)) 
    

  2. Opret en ny miljøvariabel, der hedder 'GI\_TYPELIB\_PATH' og tilføj den kopierede gi\_repository-mappe i dit projekt \ lib dir til dets værdi. Eller tilføj denne sti dynamisk i runtime ved hjælp af os.path.dirname(sys.executable).