2017-01-08 11 views
0

Wenn Sie pandoc direkt mit minimalem Beispiel kein Problem führen:subprocess.run nicht ordnungsgemäß ausgeführt 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> 

Aber wenn Sie es über subprocess.run nennen, dann scheitert es. Dieses minimale Beispiel:

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) 

gibt uns

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

'' subprocess.run'' macht genau, was es dokumentiert ist zu tun. '' subprocess.check_output'' scheint dem zu entsprechen, was Sie tun möchten. – jasonharper

Antwort

1

Eines der Dinge, dass Python (und alle anderen Programmiersprachen) tut Durchführung gemeinsamer Operationen zu erhöhen, ist ein Puffer für Dinge wie Datei Druck aufrecht zu erhalten . Abhängig davon, wie viel Sie in eine Datei schreiben, wird nicht alles sofort geschrieben, wodurch die Sprache die Menge an (langsamen) Operationen reduzieren kann, die sie tun muss, um Dinge auf die Festplatte zu bekommen. Wenn Sie f.flush() nach f.write(contents) aufrufen, sollten Sie sehen, pandoc den tatsächlichen Inhalt der Datei abholen.

Es gibt eine weitere Pufferschicht, die ebenfalls erwähnenswert ist - Ihr Betriebssystem hat möglicherweise eine aktualisierte Version der Datei im Speicher, aber möglicherweise nicht auf die Festplatte geschrieben. Wenn Sie einen Server schreiben, können Sie auch os.fsync aufrufen, wodurch das Betriebssystem gezwungen wird, es auf die Festplatte zu schreiben.

+0

kann ich nicht in [Dokumentation] (https://docs.python.org/3.6/tutorial/inputoutput.html) sehen. Vielleicht könnten Python-Entwickler in Docs aufnehmen – somenxavier

+1

Das ist ein großartiger Punkt. Es gibt eine [Erwähnung] (https://docs.python.org/3/library/functions.html#open) in den Dokumenten für 'open()', und einige zusätzliche Details in [io] (https: // docs.python.org/3.6/library/io.html) Dokumente. Wenn Sie sich besser fühlen, ist dieses Verhalten in C, C++, Ruby und im Grunde jeder anderen Programmiersprache gleich. Das Wissen ist also ziemlich portabel. –

Verwandte Themen