50

C++ ソース ファイルと Python ソース ファイルがあります。C++ ソース ファイルで、Python ソース ファイルの内容を大きな文字列リテラルとして使用できるようにしたいと考えています。私はこのようなことができます:

char* python_code = "
#include "script.py"
"

しかし、各行の末尾に \ が必要なため、これは機能しません。Python コードの内容を手動でコピー アンド ペーストし、各行を引用符と末尾の \n で囲むこともできますが、それは見苦しいものです。Python ソースは効果的に私の C++ アプリにコンパイルされますが、別のファイルに保存したいと思います。これは、より整理されており、エディターでより適切に機能するためです (emacs は、C文字列リテラルを認識できるほどスマートではありません)。は python コードであり、その中にいる間は python モードに切り替えます)。

私が PyRun_File を使用することを提案しないでください、それは私が最初に避けようとしているものです ;)

4

7 に答える 7

42

C/C++ プリプロセッサはトークン単位で動作し、文字列リテラルは 1つのトークンです。そのため、そのような文字列リテラルの途中で介入することはできません。

script.py を次のように前処理できます。

"some code\n"
"some more code that will be appended\n"

ただし、それを #include します。または、含める準備ができている C 静的配列を生成するために使用できます。xxd​ -i

于 2009-08-07T18:28:41.547 に答える
13

これで完全に到達することはできませんが、かなり近づくことができます。

これが含まれていると仮定script.pyします:

print "The current CPU time in seconds is: ", time.clock()

まず、次のようにまとめます。

STRINGIFY(print "The current CPU time in seconds is: ", time.clock())

次に、それを含める直前に、次のようにします。

#define STRINGIFY(x) #x

const char * script_py =
#include "script.py"
;

それよりももっときつい答えがあるかもしれませんが、私はまだ探しています。

于 2013-03-06T02:34:42.660 に答える
4

このようなことを行う最善の方法は、環境/ツールセットにその機能がある場合、ファイルをリソースとして含めることです。

そうでない場合 (組み込みシステムなど)、bin2c ユーティリティ ( http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.cなど) を使用できます。ファイルのバイナリ表現を取得し、そのデータに初期化されたバイト配列を含む C ソース ファイルを吐き出します。配列を '\0' で終了させたい場合は、ツールまたは出力ファイルを微調整する必要があるかもしれません。

bin2c ユーティリティの実行を makefile に組み込みます (または、ビルドの実行に使用するもののビルド前の手順として)。次に、ファイルをコンパイルしてアプリケーションにリンクするだけで、配列によって表されるメモリのチャンクに文字列 (またはファイルのその他のイメージ) が格納されます。

テキスト ファイルを文字列として含める場合、行末が関数が期待するものと一致しない可能性があることに注意してください。これは、bin2c ユーティリティに追加するか、コードがファイル内の行末を適切に処理するようにします。おそらく、bin2c ユーティリティを変更して、テキスト ファイルを文字列として組み込むことを示す「-s」スイッチを設定し、行末が正規化され、ゼロ バイトが配列の最後に来るようにします。

于 2009-08-07T23:16:26.287 に答える
1

Pythonコードに含まれる二重引用符、円記号、三重音字、および場合によっては他のものを処理するには、Pythonコードで独自の処理を行う必要があります。同時に、改行を\ nに変換(またはバックスラッシュでエスケープ)して、両端に二重引用符を追加することができます。結果は、Pythonソースファイルから生成されたヘッダーファイルになり、#includeすることができます。ビルドプロセスを使用してこれを自動化し、PythonソースをPythonとして編集できるようにします。

于 2009-08-07T18:32:57.623 に答える
1

ビルド プロセスの一部としてCogを使用できます(前処理を行い、コードを埋め込むため)。この結果がおそらく理想的ではないことは認めます。なぜなら、両方の場所でコードが表示されることになるからです。しかし、「Python」、「C++」、および「プリプロセッサ」が非常に接近しているのを見るたびに、言及する価値があると感じます。

于 2009-08-07T18:58:11.627 に答える
-2

cmd.exeで変換を自動化する方法は次のとおりです

------ html2h.bat ------

@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g 
echo.
echo ";

みたいに呼ばれていました。

cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"

によってコードに添付されます

#include "../Debug/src/html.h"
printf("%s\n", html_page);

これはかなりシステムに依存するアプローチですが、ほとんどの人がそうであるように、私は 16 進ダンプが嫌いでした。

于 2013-05-07T16:24:06.407 に答える
-10

fopengetline、およびを使用しfcloseます。

于 2009-08-07T19:42:04.957 に答える