如果这是一个新手问题,我是守护进程的新手.
在其他几个答案中(例如,这个问题),人们建议使用python-daemon包,因为它完全实现了PEP 3143标准.
不幸的是,python-daemon 在文档上有点亮(或者更有可能我对知识/经验有点轻视......;)),我想我可能遗漏了一些非常基本的东西.这是我正在做的事情:
我有以下内容:
import daemon
logfile = open('daemon.log', 'w')
context = daemon.DaemonContext(stdout = logfile, stderr = logfile)
context.open()
with context:
do_something_1()
do_something_2()
Run Code Online (Sandbox Code Playgroud)
问题:如何使用python-daemon设置守护进程,如何启动并停止它?
附注:
我基本上猜测这个.open()方法应该如何/是否应该在这里使用 - 文档在这一点上并不是很明确.无论我是否包括它,似乎都会发生同样的事情.
所以,现在我该怎么办?当我尝试运行此文件时,例如:
python startConsumerDaemons.py
Run Code Online (Sandbox Code Playgroud)
它似乎运行do_something_1(),但不是第二个.而且,它似乎离开程序连接到终端窗口.IE,stdout没有重定向,当我关闭终端窗口时,进程被终止.所以,我很确定我在这里做错了什么......我应该做些什么呢?
最后,一旦我让守护进程运行,我该如何停止/重启它(例如,如果我对底层代码进行了更改)?
我在我的一个模型中有一个字段,如下所示:
payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES)
PAYROLL_CHOICES = (
('C1', 'Choice1'),
('C2', 'Choice2')
etc.....
)
Run Code Online (Sandbox Code Playgroud)
当我为该字段创建模型表单时,Django正确生成HTML选择框,但包含默认空白值"---------".
我想知道如何将此默认值更改为其他文本,例如"请选择值".
我相信我应该可以通过以下方式在我的模型表单的init中设置它,如本答案和其他几个文档中所述:
self.fields['payrollProvider'].empty_label = "please choose value"
Run Code Online (Sandbox Code Playgroud)
但是,这对我不起作用.当我在表单的init中包含该行时,"--------"仍然显示为选择框中的初始选项.我正在粘贴下面的相关forms.py,但似乎其他人也无法访问/修改empty_label.在这个链接中,提问者描述了一种删除默认empty_label值的方法(我能够通过他的方法成功完成),但我真正想做的是修改显示的empty_label.
有任何想法吗?
这是forms.py中表单的代码,其中empty_label代码在更改默认值"----------"时未成功:
class PayrollCredentialForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PayrollCredentialForm, self).__init__(*args, **kwargs)
self.fields['payrollUsername'].widget.attrs.update({'class' : 'yp-signup'})
self.fields['payrollPassword'].widget.attrs.update({'class' : 'yp-signup'})
self.fields['payrollProvider'].widget.attrs.update({'class' : 'yp-signup'})
self.fields['payrollUsername'].widget.attrs.update({'placeholder' : ' Payroll Username'})
self.fields['payrollPassword'].widget.attrs.update({'placeholder' : ' Payroll Password'})
self.fields['payrollProvider'].empty_label = "please choose value"
class Meta:
model = Company
fields = ('payrollProvider', …Run Code Online (Sandbox Code Playgroud) 我正在尝试序列化(自定义)Django用户模型的实例,如下所示:
在models.py中:
Class Employee(User):
company = models.ForeignKey('Company')
additionalField1
additionalField2
etc....
Run Code Online (Sandbox Code Playgroud)
在上面的Employee模型中,除了从User模型继承的属性之外,我还使用以下模型字段类型:CharField(),NullBooleanField(),IntegerField(),DateField(),DecimalField()
有问题的代码:
employee = Employee()
(snip large amounts of code that sets various attributes for employee)
serializers.serialize("json", [employee, ])
Run Code Online (Sandbox Code Playgroud)
(我已经安装了WadOfStuff的Django完整的串行器插件,顺便说一句,重要的是 - 但在这种情况下我认为它应该默认为标准的Django序列化器,因为在这种情况下我没有使用任何完整的串行器的功能)
在尝试序列化之前,员工__dict__(有几个关键字段是匿名的):
{'status': u'Act', 'last_name': u'Doe', 'payFrequency': u'Mo', '_state':
<django.db.models.base.ModelState object at 0x15be890>, 'sex': u'M', 'user_ptr_id':
None, 'is_staff': False, 'isRegistered': False, 'hireDate': u'2012-08-01', 'id': None,
'date_joined': datetime.datetime(2012, 10, 25, 2, 39, 22, 793015, tzinfo=<UTC>),
'city': u'San Francisco', 'first_name': u'John', 'zip': u'94114', u'employmentType':
u'FT', 'company_id': 4, 'compType': u'S', 'is_superuser': False, …Run Code Online (Sandbox Code Playgroud) Python中的字符串有一个find("somestring")方法,它返回字符串中"somestring"的索引号.
但是,假设我有一个如下字符串:
"$ 5 $ 7 $ 9总费用:$ 35 $ 14"
我想找到字符串"Total Cost" 之后第一次出现'$'的索引- 我希望能够告诉python,搜索'$',从索引编号开始"总成本",并返回您找到的第一次出现'$'的索引号(相对于整个字符串).find()方法将返回0,并且在这种情况下rfind()将不起作用.
一种克服这种方式的方法如下:
def findStrAfterStr(myString, searchText, afterText):
splitString = myString.split(afterText)
myIndex = len(splitString[0]) + len(afterText) + splitString[1].find(searchText)
return myIndex
myString = "$5 $7 $9 Total Cost: $35 $14"
searchText = "$"
afterText = "Total Cost"
findStrAfterStr(myString, searchText, afterText)
Run Code Online (Sandbox Code Playgroud)
但似乎应该有一种更简单的方法来做到这一点,我认为可能存在,我只是不知道它是什么.思考?
当我发现自己做了很多这样的事情时,这对切片特别有用:
myString[myString.find("startingSubstr"):myString.find("endingSubstr")]
Run Code Online (Sandbox Code Playgroud)
我自然希望"endingSubstr"成为"startingSubstr"之后出现的那个.
RabbitMQ启动很好,但铲子插件状态被列为"开始".
我正在使用以下rabbitmq.config:
每个代理都在单独的AWS实例上运行.远程服务器是windows 2008服务器,本地服务器是Amazon Linux.
Run Code Online (Sandbox Code Playgroud)[{rabbitmq_shovel, [{shovels, [{scrape_request_shovel, [{sources, [{broker,"amqp://test_user:test_password@localhost"}]}, {destinations, [{broker, "amqp://test_user:test_password@ec2-###-##-###-###.compute-1.amazonaws.com"}]}, {queue, <<"scp_request">>}, {ack_mode, on_confirm}, {publish_properties, [{delivery_mode, 2}]}, {publish_fields, [{exchange, <<"">>}, {routing_key, <<"scp_request">>}]}, {reconnect_delay, 5} ]} ] }] }].
运行以下命令:
sudo rabbitmqctl eval'habit_shovel_status:status().'
收益:
[{scrape_request_shovel,启动,{{2012,7,11},{23,38,47}}}]
根据这个问题,如果没有在两个经纪人上正确设置用户,可能会导致这种情况.但是,我已经仔细检查过我已经在两台机器上通过rabbitmqctl user_add正确设置了用户 - 甚至尝试使用不同的用户集来确定用户.
我还在远程主机上运行了端口5672的nmap扫描,以验证该端口是否已启动并正在运行.
更新问题未解决,但这似乎是远程服务器连接问题的结果.我在配置文件中将"reconnect_delay"更改为0,以避免铲子无限次重新尝试连接.强烈推荐其他有这个问题的人也这样做,因为它允许你从rabbit_shovel_status中获取错误信息.在我的情况下,我得到以下错误:
Run Code Online (Sandbox Code Playgroud)[{scrape_request_shovel, {terminated, {{badmatch,{error,access_refused}}, [{rabbit_shovel_worker,make_conn_and_chan,1}, {rabbit_shovel_worker,handle_cast,2}, {gen_server2,handle_msg,2}, {proc_lib,init_p_do_apply,3}]}}, {{2012,7,12},{0,4,37}}}]