Estoy tratando de utilizar el win32job API que es parte de la PyWin32 paquete. Yo quiero hacer esto:

win32job.CreateJobObject(None, NULL)

Quiero pasar NULL como el segundo parámetro, como se indica a continuación:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682409(v=vs 85).aspx

Si lpName es NULA, el trabajo se crea sin un nombre.

¿Cómo puedo pasar NULL?

Aquí es lo que yo esperaba que fuera a trabajar, pero no:

win32job.CreateJobObject(None, None)

De Error:

TypeError: None is not a valid string in this context

(Lado de la pregunta… si alguien sabe cómo ver JobObjects asociado con un proceso de Windows, que sería útil).

  • En caso de que ayuda, he descargado el pywin32 código fuente. Parece que el uso de lámpara: // @pyswig |CreateJobObject|Creates or opens a job object. PyHANDLE CreateJobObject( SECURITY_ATTRIBUTES *lpJobAttributes, // @pyparm <o PySECURITY_ATTRIBUTES>|jobAttributes|| WCHAR *lpName); // @pyparm unicode|name||
InformationsquelleAutor D. A. | 2017-10-17

1 Comentario

  1. 1

    Puede utilizar win32job.CreateJobObject(None, ""). Aunque no está especificado en [La SEÑORA Docs]: CreateJobObjectA función, la cadena vacía actúa como NULL.

    Según el enlace de arriba:

    Si la función tiene éxito, el valor de retorno es un identificador de objeto de trabajo. El mango tiene la JOB_OBJECT_ALL_ACCESS derecho de acceso. Si el objeto al que existía antes de la llamada a la función, la función devuelve un identificador para el trabajo existente objeto y GetLastError devuelve ERROR_ALREADY_EXISTS.

    Escribí un pequeño C programa para demostrar los efectos de:

    #include <Windows.h>
    #include <stdio.h>
    
    #define EMPTY_TEXT ""
    #define DUMMY0_TEXT "dummy0"
    #define DUMMY1_TEXT "dummy1"
    
    #define DIM 12
    
    int main() {
        char* names[DIM] = { NULL, NULL, EMPTY_TEXT, EMPTY_TEXT, DUMMY0_TEXT,
                             DUMMY0_TEXT, EMPTY_TEXT, DUMMY0_TEXT, DUMMY1_TEXT,
                             NULL, DUMMY0_TEXT, DUMMY1_TEXT };
        HANDLE jobs[DIM] = { NULL };
        for (int i = 0; i < DIM; i++) {
            jobs[i] = CreateJobObjectA(NULL, names[i]);
            printf("%02d [%6s] CreateJobObject: %08X - GetLastError: %d\n", i, names[i], (long)jobs[i], GetLastError());
        }
        for (int i = 0; i < DIM; i++)
            CloseHandle(jobs[i]);
        return 0;
    }

    Salida (construido y corrió con VStudio 2015 Edición de la Comunidad):

    00 [(null)] CreateJobObject: 000000D8 - GetLastError: 0
    01 [(null)] CreateJobObject: 000000E0 - GetLastError: 0
    02 [      ] CreateJobObject: 00000088 - GetLastError: 0
    03 [      ] CreateJobObject: 000000F0 - GetLastError: 0
    04 [dummy0] CreateJobObject: 000000F4 - GetLastError: 0
    05 [dummy0] CreateJobObject: 000000F8 - GetLastError: 183
    06 [      ] CreateJobObject: 000000E8 - GetLastError: 0
    07 [dummy0] CreateJobObject: 000000FC - GetLastError: 183
    08 [dummy1] CreateJobObject: 00000100 - GetLastError: 0
    09 [(null)] CreateJobObject: 000000DC - GetLastError: 0
    10 [dummy0] CreateJobObject: 000000E4 - GetLastError: 183
    11 [dummy1] CreateJobObject: 00000104 - GetLastError: 183

    Se puede ver que para «dummy0» y «dummy», cada vez que (a excepción de la 1san) cuando se crea un nuevo objeto, la función devuelve un nuevo MANEJAR, pero falla (GetLastError devuelve 183 (que es ERROR_ALREADY_EXISTS)). Esto no sucede para NULL y la cadena vacía nombres (de aquí entiendo que se crea un nuevo objeto con cada llamada, en lugar de incrementar un objeto existente de referencia).


    Python «traducción» (code.py):

    #!/usr/bin/env python3
    
    import win32job
    import win32api
    
    DUMMY0 = "dummy00"
    DUMMY1 = "dummy11"
    
    JOB_NAMES = ["", "", DUMMY0, DUMMY0, "", DUMMY1, DUMMY0, "", DUMMY1]
    
    if __name__ == "__main__":
        handles = list()
        for i, name in enumerate(JOB_NAMES):
            h = win32job.CreateJobObject(None, name)
            print("{} [{:10}] {} - GetLastError: {}".format(i, name, h, win32api.GetLastError()))
            handles.append(h)
    
        for h in handles:
            win32api.CloseHandle(h)

    Salida (mismo resultado que en Cel caso – lo cual es natural ya que Python funciones sólo envuelven el nivel inferior C queridos):

    (py35x64_test) e:\Work\Dev\StackOverflow\q046800142>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
    0 [          ] <PyHANDLE:300> - GetLastError: 0
    1 [          ] <PyHANDLE:308> - GetLastError: 0
    2 [dummy00   ] <PyHANDLE:580> - GetLastError: 0
    3 [dummy00   ] <PyHANDLE:584> - GetLastError: 183
    4 [          ] <PyHANDLE:588> - GetLastError: 0
    5 [dummy11   ] <PyHANDLE:592> - GetLastError: 0
    6 [dummy00   ] <PyHANDLE:596> - GetLastError: 183
    7 [          ] <PyHANDLE:600> - GetLastError: 0
    8 [dummy11   ] <PyHANDLE:604> - GetLastError: 183

    Respecto al «lado» de la pregunta: por desgracia, no estoy familiarizado con ese tema.

Dejar respuesta

Please enter your comment!
Please enter your name here