我已经创建了我自己的(非常简单的)字节代码语言,以及一个执行它的虚拟机.它工作正常,但现在我想使用gcc(或任何其他免费提供的编译器)从普通的c程序为这台机器生成字节代码.所以问题是,如何修改或扩展gcc以便它可以输出我自己的字节代码?请注意,我不想将我的字节代码编译为机器代码,我想将c代码"编译"为(我自己的)字节代码.
我意识到这是一个潜在的大问题,最好的答案可能是"去看看gcc源代码".我只是需要一些帮助来解决这个问题.我认为必须有一些关于这个主题的文章或书籍可以描述向gcc添加自定义生成器的过程,但我没有通过谷歌搜索找到任何东西.
我有一个相当大的python 2.6应用程序,其中包含大量的打印语句.我一直在使用unicode字符串,它通常很好用.但是,如果我重定向应用程序的输出(如"myapp.py> output.txt"),那么我偶尔会遇到如下错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我想如果有人将他们的LOCALE设置为ASCII,就会出现同样的问题.现在,我完全理解这个错误的原因.我的Unicode字符串中有一些字符无法用ASCII编码.很公平.但我希望我的python程序尽最大努力尝试打印可理解的东西,可能会跳过可疑字符或用Unicode ID替换它们.
这个问题必须是常见的......处理这个问题的最佳做法是什么?我更喜欢一种允许我继续使用普通旧"打印"的解决方案,但我可以根据需要修改所有实例.
PS:我现在已经解决了这个问题.解决方案既不是给出的答案.我使用了http://wiki.python.org/moin/PrintFails中给出的方法,由ChrisJ在其中一条评论中给出.也就是说,我用一个使用正确参数调用unicode编码的包装器替换sys.stdout.效果很好.
我正在尝试编写一个使用多个进程计算校验和的类,从而利用多个核心.我有一个非常简单的类,它在执行一个简单的案例时很有用.但每当我创建两个或更多类的实例时,工作者永远不会退出.好像从来没有得到父管道关闭管道的消息.
所有代码都可以在下面找到.我首先分别计算md5和sha1校验和,这是有效的,然后我尝试并行执行计算,然后程序在关闭管道时锁定.
这里发生了什么?管道为什么不像我预期的那样工作?我想我可以通过在队列上发送"停止"消息并让孩子退出这种方式来解决这个问题,但我真的很想知道为什么它不能正常工作.
import multiprocessing
import hashlib
class ChecksumPipe(multiprocessing.Process):
def __init__(self, csname):
multiprocessing.Process.__init__(self, name = csname)
self.summer = eval("hashlib.%s()" % csname)
self.child_conn, self.parent_conn = multiprocessing.Pipe(duplex = False)
self.result_queue = multiprocessing.Queue(1)
self.daemon = True
self.start()
self.child_conn.close() # This is the parent. Close the unused end.
def run(self):
self.parent_conn.close() # This is the child. Close unused end.
while True:
try:
print "Waiting for more data...", self
block = self.child_conn.recv_bytes()
print "Got some data...", self
except EOFError:
print "Finished work", self
break
self.summer.update(block) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用python subprocess.Popen()调用与子进程通信.在我的实际代码中,我正在实现一种类型的IPC,因此我想编写一些数据,读取响应,写入更多数据,读取响应等等.因此,我不能使用Popen.communicate(),否则它将适用于简单的情况.
这段代码显示了我的问题.它从来没有得到第一个响应,挂在第一个"阅读结果".为什么?我怎样才能像我期望的那样完成这项工作?
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
Run Code Online (Sandbox Code Playgroud) 我正在尝试在python 2.6中使用多处理模块,但显然有些东西我不明白.我希望下面的类能够添加add()发送给它的数字,并在get_result()方法中返回总和.下面的代码打印"0",我希望它打印"2".我错过了什么?
import multiprocessing
class AdderProcess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = 0
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()
def run(self):
while True:
number = self.queue.get()
self.sum += number
self.queue.task_done()
def add(self, number):
self.queue.put(number)
def get_result(self):
self.queue.join()
return self.sum
p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()
Run Code Online (Sandbox Code Playgroud)
PS.这个问题已经解决了.谢谢你的回答!只是为了让任何读者更容易,这是完整的工作版本:
import multiprocessing
class AdderProcess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = multiprocessing.Value('d', 0.0)
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()
def run(self):
while True:
number = self.queue.get()
self.sum.value += number
self.queue.task_done()
def add(self, number): …Run Code Online (Sandbox Code Playgroud)