无法传递包含各种字符的python宏中的g++

2024-09-29 21:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的djangopython项目中,我曾通过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++脚本中将它们转回来,但我不能确定我的宏将包含什么内容,这取决于将使用我的网络应用程序的用户。你知道吗

老实说,我有一个想法,以避免它,但它是完全愚蠢的,与愚蠢的打开新文件和阅读他们什么需要时间。你知道吗

也许我错了,这个问题有不同的性质,我希望你能帮助我或给予有益的建议。你知道吗


Tags: 项目字符串ingt脚本stringthresholdos
3条回答

这个问题与shell或编译器调用无关,尽管我真诚地认为您最好使用不同的方法从python调用编译器,例如[subprocess]1模块。你知道吗

<>你的C++程序中的某个地方你有:

string filename = to_string(djangoname);

您正在使用-D选项来有效地插入

#define djangoname >gi|111>gi|222>gi|333>gi|444

在你的课程开始的时候。这意味着您的文件名声明将是:

string filename = to_string(>gi|111>gi|222>gi|333>gi|444);
这根本没有意义,既没有C++,也没有我。因此出现了错误消息,即不能用>运算符启动表达式。你知道吗

我不认为你是这个意思,但我不知道你真正想做什么。你知道吗

必须使宏显式地成为字符串,例如

os.system('g++ ... -Ddjangoname="' + ... + '" ...')

注意双引号的位置。你知道吗

os.system('g++ ...')不会直接启动g++进程。它实际上启动任何配置为默认shell的东西(例如/bin/sh),然后shell解释命令行。你知道吗

为了避免这种不必要的循环及其复杂性,您可以直接使用Python的子流程.Popen以及它的communicate()方法。这允许您将命令行参数作为数组传递。你知道吗

例如:

import sys, subprocess
filename2only = '">gi|111>gi|222>gi|333>gi|444"'
args = [
    'g++',
    '-std=c++0x', 'mutualcepepe.cpp',
    '-Ddjangoname=' + str(filename2only),
    '-omutualout'
]
p = subprocess.Popen(args=args, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
sys.stdout.write(stdout)
sys.stderr.write(stderr)
if p.returncode != 0: sys.stderr.write('failed with exit code: ' + str(p.returncode))

这会将-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,包含双引号!你知道吗

相关问题 更多 >

    热门问题