在我的django
python项目中,我曾通过g++
调用我的C++
脚本:
os.system('g++ -std=c++0x mutualcepepe.cpp -D "threshold = ' + str(thresh) + '" -o mutualout')
“thresh”是一个简单的浮点变量。它工作了,但整个项目的想法改变了一点,现在我想传递一个字符串,其中包含不同的字符,比如说“类型”。 我将在示例中说明我的问题,在本例中,我的宏“djangoname”(不再是“threshold”)是“>;gi | 111>;gi | 222>;gi | 333>;gi | 444”。 调用:
os.system('g++ -std=c++0x mutualcepepe.cpp -D "djangoname = ' + str(filename2only) + '" -o mutualout')
终端出错:
mutualcepepe.cpp: In function ‘int main(int, char**)’:
<command-line>: 0:14: error: expected primary-expression before ‘>’ token
mutualcepepe.cpp:
99:30: note: in expansion of macro ‘djangoname’ string filename
to_string(djangoname);
^
<command-line>:0:15: error: ‘gi’ was not declared in this scope
mutualcepepe.cpp:99:30: note: in expansion of macro ‘djangoname’
string filename = to_string(djangoname);
我认为关键是,当g++编译器“读取”宏所包含的内容时,它会对其进行某种程度的除法,当它得到特殊字符时,或者当它在数字之后读取字母时,因为在这之后它将它视为整数而不是字符串数据。所以我的问题是,有没有可能传入g++包含“不同类型”字符的宏(或者无论如何是“字符串变量”),以g++编译器运行时不会出现问题的方式?你知道吗
我想知道如何将一些“非传统”字符翻译成其他字符,并在c++脚本中将它们转回来,但我不能确定我的宏将包含什么内容,这取决于将使用我的网络应用程序的用户。你知道吗
老实说,我有一个想法,以避免它,但它是完全愚蠢的,与愚蠢的打开新文件和阅读他们什么需要时间。你知道吗
也许我错了,这个问题有不同的性质,我希望你能帮助我或给予有益的建议。你知道吗
这个问题与shell或编译器调用无关,尽管我真诚地认为您最好使用不同的方法从python调用编译器,例如
<>你的C++程序中的某个地方你有:[subprocess
]1模块。你知道吗您正在使用
-D
选项来有效地插入在你的课程开始的时候。这意味着您的文件名声明将是:
这根本没有意义,既没有C++,也没有我。因此出现了错误消息,即不能用>
运算符启动表达式。你知道吗我不认为你是这个意思,但我不知道你真正想做什么。你知道吗
必须使宏显式地成为字符串,例如
注意双引号的位置。你知道吗
os.system('g++ ...')
不会直接启动g++进程。它实际上启动任何配置为默认shell的东西(例如/bin/sh),然后shell解释命令行。你知道吗为了避免这种不必要的循环及其复杂性,您可以直接使用Python的子流程.Popen以及它的communicate()方法。这允许您将命令行参数作为数组传递。你知道吗
例如:
这会将
-Ddjangoname=">gi|111>gi|222>gi|333>gi|444"
选项传递给编译器,该选项相当于#define djangoname ">gi|111>gi|222>gi|333>gi|444"
。你知道吗注意,
str(filename2only)
在这种情况下并不是绝对必要的,但是它具有支持任何类型的值(string、int或float)的良好特性。你知道吗例如,你可以:
filename2only = 12.3
传递-Ddjangoname=12.3
,相当于#define djangoname 12.3
filename2only = 'a b c'
传递-Ddjangoname=a b c
,相当于#define djangoname a b c
filename2only = '"a b c"'
传递-Ddjangoname="a b c"
,相当于#define djangoname "a b c"
filename2only = '"a \\"b\\" c"'
传递-Ddjangoname="a \"b\" c"
,相当于#define djangoname "a \"b\" c"
,即djangName是字符串a "b" c
,包含双引号!你知道吗相关问题 更多 >
编程相关推荐