2017-01-08 2 views
0

Si vous exécutez pandoc directement avec un minimum exemple pas de problème:subprocess.run ne fonctionne correctement pandoc

$ cat workfile.md 
This is a **test** see ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png) 
$ pandoc workfile.md 
<p>This is a <strong>test</strong> see <img src="https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png" alt="alt text" /></p> 

Mais si vous appelez via subprocess.run, il échoue. Cet exemple minimal:

import subprocess, os 

path = 'workfile.md' 
contents = "This is a **test** see ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png)" 

with open(path, 'w') as f: 

    f.write(contents) 
    pbody = subprocess.run(["pandoc", "{}".format(path)], check=True, stdout=subprocess.PIPE) 
    print("**** pbody: ", pbody) 

nous donne

**** pbody: CompletedProcess(args=['pandoc', 'workfile.md'], returncode=0, stdout=b'\n') 
+0

'' subprocess.run'' fait exactement ce que c'est documenté. '' subprocess.check_output'' semble être plus proche de ce que vous voulez faire. – jasonharper

Répondre

1

L'une des choses que Python (et toutes les autres langages de programmation) faire pour améliorer la performance des opérations courantes est de maintenir un tampon pour des choses telles que l'impression de fichiers . Selon la quantité d'écriture que vous écrivez dans un fichier, tout ne sera pas écrit immédiatement, ce qui permet au langage de réduire le nombre d'opérations (lentes) qu'il doit effectuer pour obtenir des informations sur le disque. Si vous appelez f.flush() après f.write(contents), vous devriez voir pandoc récupérer le contenu actuel du fichier.

Il existe une autre couche de mise en mémoire tampon qui mérite également d'être mentionnée: votre système d'exploitation peut avoir une version mise à jour du fichier en mémoire, mais peut ne pas l'avoir réellement écrite sur le disque. Si vous écrivez un serveur, vous pouvez également appeler le os.fsync, ce qui forcera l'OS à l'écrire sur le disque.

+0

Je ne peux pas voir dans [documentation] (https://docs.python.org/3.6/tutorial/inputoutput.html). Peut-être que les développeurs Python pourraient inclure dans les documents – somenxavier

+1

C'est un excellent point. Il y a une [mention] (https://docs.python.org/3/library/functions.html#open) dans les docs pour 'open()', et quelques détails supplémentaires dans le [io] (https: // docs.python.org/3.6/library/io.html) docs. Si cela vous fait vous sentir mieux, ce comportement est le même en C, C++, ruby, et fondamentalement tous les autres langages de programmation. Donc, la connaissance est assez portable. –