IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Téléphone branché USB sous Windows, inaccessible à Python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut Téléphone branché USB sous Windows, inaccessible à Python
    Bonjour

    Je branche un téléphone android Samsung en USB sous Windows 11. Ce téléphone a une carte SD qui a de nombreux fichiers multimédia (musique, vidéos, e-books), et je voudrais les gérer avec mon programme Python de sauvegarde incrémentale. Mais je n'arrive pas à y accéder sous Python!

    Voilà ce que je connais du sujet:

    - L'explorateur de fichiers reconnait le téléphone sans problème, et permet de gérer ses fichiers (navigation, copie, effacement, etc...).

    - mais le téléphone n'est pas reconnu comme un disque USB.

    - aucune lettre de drive ne lui est affecté par Windows.

    - il n'apparait pas dans le programme d'administration "gestion des disques".

    - Si je demande à l'explorateur l'adresse de la carte mémoire du téléphone, il me donne (A52S est le nom du téléphone):

    ce qui est,bien sûr, refusé comme adresse par Python (os.access) comme par la console cmd.

    Il faudrait que le téléphone soit reconnu comme disque USB. J'ai lu un truc comme "MTP" qui pourrait faire ça, mais je ne sais pas comment le trouver et l'activer. Si je n'ai pas de réponse ici, j'irais voir un forum plus spécialisé Windows.

    Quelqu'un a-t-il une idée pour ça?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Il faudrait que le téléphone soit reconnu comme disque USB. J'ai lu un truc comme "MTP" qui pourrait faire ça, mais je ne sais pas comment le trouver et l'activer. Si je n'ai pas de réponse ici, j'irais voir un forum plus spécialisé Windows.
    Sur les téléphone récent le protocole MSC n'est plus supporté, seul MTP et PTP le sont.
    note: la différence est que MSC suppose que le disque ne soit plus accessible par le côté téléphone (pour éviter des corruptions) alors que MTP et PTP installent un serveur (côté téléphone) au dessus des données (on n'y accède plus directement).

    Il existe une libmtp et la bibliothèque python pymtp pour l'utiliser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Merci wiztricks pour les infos. Mais après quelques heures de recherche, la perspective de réussite de mon projet a pris un coup dans l'aile.

    Voilà ce que j'ai appris:

    - l'utilisation du téléphone comme un disque USB normal (="USB Mass Storage") est exclue! Le protocole MTP est limité aux fichiers multimédia, et fonctionne comme un serveur avec des requêtes (pas d'accès direct).

    - la bibliothèque libmtp n'existe pas en binaire sous Windows, et il faut la compiler soi-même, ce qui complique sérieusement l'opération.

    - Le module externe Python pymtp, nécessaire pour exploiter libmtp, date de 2013! Pourra-il trouver les fonctions à utiliser dans les versions plus récentes de libmtp avec ctypes?

    Il me reste 3 possibilités:

    - rester avec l'explorateur de fichier Windows, ce qui veut dire que la moindre modification souhaitée de fichiers multimédia nécessitera la copie entière du répertoire concerné (donc, pas de copie incrémentale).

    - gérer mes fichiers multimédia directement sur la carte SD avec un lecteur de carte. Mais ça demande une manipulation (extraire/remettre la carte SD du téléphone) et un risque: les modifications seront-elles acceptées par android?

    - essayer d'accéder au téléphone sous Linux, voire MacOS, en espérant des solutions possibles?

    A moins que quelqu'un ait une idée géniale?

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Hello,
    peut-être une autre possibilité le Powershell en commande externe. Avec un script powershell sous windows 11, j'arrive à lister les fichiers accessibles qui se trouvent sur mon smartphone android (ex répertoire : music).
    LireFichiersSmartphone.ps1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    # http://blogs.technet.com/b/heyscriptingguy/archive/2013/04/26/use-powershell-to-work-with-windows-explorer.aspx
    $o = New-Object -com Shell.Application
    $folder = $o.NameSpace(0x11)
     
     
    # https://msdn.microsoft.com/en-us/library/windows/desktop/bb774096(v=vs.85).aspx
    # ShellSpecialFolderConstants.ssfDRIVES == 0x11
     
     
    $items = $folder.Items()
    for ($i= 0; $i -lt $items.Count; $i++) {
        write-output ([string]$i + ": " + $items.Item($i).Name)
    }
    $choice = Read-Host "Make your choice"
     
     
    $android = $items.Item([int]$choice)
    $root = $android.GetFolder()
     
     
    # FolderItem versus FolderItems
     
     
    $maxdepth = Read-Host "Max depth"
     
     
    Function Write-Items($item, $depth, $maxdepth) {
        if ($depth -ge $maxdepth) {
            return;
        }
        $indent = ""
        for ($i = 0; $i -lt $depth; $i++) {
            $indent += "   ";
        }
        #write-output ($indent + "Name: " + $item.name)
        if ($item.Title) {
            $hash = @{
                Name = $item.Title
                Size = $null #$item.ParentFolder.GetDetailsOf($item, 2)
                Modified = $null #$item.ParentFolder.GetDetailsOf($item, 3)
                Parent = $item.ParentFolder.Title
                Level = $depth
            }
            $Object = New-Object PSObject -Property $hash            
            write-output $object
        } else {
            $hash = @{
                Name = $item.Name
                Size = $item.Parent.GetDetailsOf($item, 2)
                Modified = $item.Parent.GetDetailsOf($item, 3)
                Parent = $item.Parent.Title
                Level = $depth
            }
            $Object = New-Object PSObject -Property $hash            
            Write-Output $object
        }
        if ($item.Count -gt 0) {
            # $item is a folder with its own items
            for ($i = 0; $i -lt $item.Count) {
                $item2 = $item.item($i)
                Write-Items $item2 $depth+1 $maxdepth
            }
     
     
        }
        else { 
            if ($item.Items) {
                $items = $item.Items()
                if ($items.Count -gt 0) {
                    foreach ($i in $items) {
                        if ($i.IsFolder) {
                            $folder = $i.GetFolder()
                            Write-Items $folder ($depth+1) $maxdepth
                        }
                        else {                    
                            Write-Items $i ($depth+1) $maxdepth
                        }
                    }
                }
            }
            else {
                # .Count == 0 and no Items present
                # we don't need to do anything further here
            }
        }
    }
     
     
    Write-Items $root 0 $maxdepth
    En Lançant le script dans un powershell administrateur voici ce que l'on obtient par exemple :
    PS D:\tmp> .\LireFichiersMTP.ps1
    0: Multimedia (laptop-xxxxxxxx)
    1: Galaxy A20e
    2: Windows-SSD (C
    3: Data (D
    Make your choice: 1
    Max depth: 5




    Level : 0
    Parent : Ce PC
    Name : Galaxy A20e
    Size :
    Modified :


    Level : 1
    Parent : Galaxy A20e
    Name : Phone
    Size :
    Modified :


    Level : 2
    Parent : Phone
    Name : Music
    Size :
    Modified :


    Level : 3
    Parent : Music
    Name : 09-Ange-Ode à Émile.mp3
    Size : 5,25 Mo
    Modified : 09/07/2020 04:41


    Level : 3
    Parent : Music
    Name : 04-Un petit poisson, un petit oiseau.mp3
    Size : 2,48 Mo
    Modified : 08/07/2020 16:25

    etc....
    A voir si ce n'est pas aussi faisable avec un object COM

    [EDIT] Cela a l'air faisable : en traduisant le début du script powershell en python en utilisant l'object COM Shell.Application avec le module pywin32 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import win32com.client
     
    shell = win32com.client.Dispatch("Shell.Application")
    folder = shell.NameSpace(0x11)
    items =  folder.Items()
    for item in items:
        print(item.Name)
    j'obtiens ceci :
    Multimedia (laptop-xxxx)
    Galaxy A20e
    Windows-SSD (C
    Data (D

    Ami calmant, J.P

  5. #5
    Invité
    Invité(e)
    Par défaut
    @juju
    Tu peux exploiter l'item après ?

    @tyrtamos
    J'ai essayé diverses choses provenant notamment d'ici http://timgolden.me.uk/python/win32_...ile.html#shell sans succès mais bon je ne comprends pas ce que je fais donc...
    Sinon j'avais pensé à une méthode barbare et quasi inutile : faire la manip avec pynput.

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    @juju
    Tu peux exploiter l'item après ?
    j'ai un souci avec ce code ensuite :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    android = items.Item(1)
    root = android.GetFolder()
    print(root)
    normalement GetFolder devrait me retourner un objet COM mais c'est une string que je récupère.

    GetFolder
    Read-only
    Contains the item's Folder object, if the item is a folder.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Avez-vous testé le module psutil ?

    https://psutil.readthedocs.io/en/lat...isk_partitions

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    J'ai pas testé psutil pour ma part. (J'aime po, trop lent)
    Développé en CPython pourtant...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bon je poste un truc un peu plus sérieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import win32com.client
    import os
     
    def open_and_explore(folder, *args):
        for arg in args:
            for directory in folder.GetFolder.Items():
                if directory.Name == arg:
                    folder = directory
                    break
     
        for pic in folder.GetFolder.Items():        
            maison.CopyHere(pic)
            break
     
    shell = win32com.client.Dispatch("Shell.Application")
    folder = shell.NameSpace(0x11)
    maison = shell.NameSpace(0x10)
    items =  folder.Items()
    for item in items:
        if item.Name == "Pixel 4a":
            open_and_explore(item, 'Espace de stockage interne partagé', 'DCIM', 'Camera')
            break
    Docs :
    https://learn.microsoft.com/en-us/wi...older-copyhere
    https://learn.microsoft.com/fr-fr/wi...hell-namespace
    https://learn.microsoft.com/fr-fr/wi...olderconstants

  10. #10
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Merci les gars! Sur un sujet aussi pointu, je ne pensais pas avoir autant de propositions!

    Je rappelle mon problème:
    - l'explorateur de fichiers de mon Windows 11 reconnait sans problème mon téléphone android branché en USB, et permet la gestion de ses fichiers (navigation, copie, effacement, ...)
    - ce que je cherche à faire, c'est faire cette gestion par Python pour automatiser les mises à jour, à partir du répertoire de référence de mon PC (copie incrémentale). La raison est simple: la copie de tous les fichiers demande plusieurs heures.

    J'ai essayé aussi par l'excellent logiciel gratuit de sauvegarde incrémentale "SyncBackFree" (que je vous recommande: https://www.2brightsparks.com/downlo...cbackfree.html), mais il ne reconnait pas non plus l'adresse des fichiers du téléphone. Il est cependant possible que ce logiciel reconnaisse MTP à condition de passer à la version payante (https://www.2brightsparks.com/syncback/help/mtp.htm): à étudier.

    Le principal obstacle que j'ai trouvé jusqu'à présent, c'est que l'accès officiel des fichiers passe par le protocole MTP qui n'est pas un accès direct. Je reconnais que les raisons de cette exclusion sont bonnes (empêcher de modifier le système, volontairement ou pas), mais ça ne m'arrange pas.

    J'ai essayé sous Linux Mint. Il reconnait mon téléphone et ses fichiers, mais leur adresse est "mtp://..." qui n'est pas acceptée par Python. Par contre, il intègre déjà par défaut le paquet "libmtp". J'ai donc installé le module Python "pymtp", mais comme je le craignais, ça ne marche pas, probablement parce qu'il est trop vieux (2013). Ce module Python utilise la libmtp, ce qui demande de retrouver ses fonctions et données avec ctypes: c'est assez compliqué...

    Je vais donc essayer les solutions proposées!

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Bonjour
    Citation Envoyé par tyrtamos Voir le message
    J'ai essayé sous Linux Mint. Il reconnait mon téléphone et ses fichiers, mais leur adresse est "mtp://..." qui n'est pas acceptée par Python
    Avec linux , nous pouvons utiliser fuse pour "masquer" le protocole. go-mtpfs fait bien le job
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cd
    mkdir android  # point de montage
    go-mtpfs android &
    ls -l "android/Mémoire de stockage interne" # liste mon tel
    cd "android/Mémoire de stockage interne/Pictures"
    touch test.jpeg  # OK, je peux écrire
    ...
    fusermount -u android # je démonte mon tel

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    J'ai trouvé une solution, même si elle n'est pas Python.

    Comme je disais au début, le logiciel de sauvegarde SyncBackFree (gratuit) ne sait pas reconnaître le protocole MTP, mais peut-être faut-il passer à une version payante.

    Je l'ai fait: j'ai choisi SyncBackSE 46,95€ (https://www.2brightsparks.com/syncback/sbse.html) et je confirme qu'il permet la sauvegarde incrémentale (avec option miroir) de mon téléphone Samsung A52s.

    Je vais tout de même continuer à chercher une solution programmable avec Python.

Discussions similaires

  1. Comm USB sous windows, faire le bon choix
    Par DOBAZ dans le forum Windows
    Réponses: 5
    Dernier message: 03/10/2011, 16h15
  2. Partager une clé USB sous Windows CE
    Par ren973 dans le forum Windows XP
    Réponses: 1
    Dernier message: 31/07/2008, 08h47
  3. L'USB sous Windows 98
    Par ArHacKnIdE dans le forum Périphériques
    Réponses: 8
    Dernier message: 07/05/2006, 10h21
  4. pb de reconnaissance de clé USB sous windows XP
    Par raynor911 dans le forum Windows XP
    Réponses: 15
    Dernier message: 14/03/2006, 22h30
  5. Clavier usb sous windows XP
    Par aouidj dans le forum Windows XP
    Réponses: 2
    Dernier message: 06/11/2005, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo