我正在尝试在python中创建一个守护进程.我发现了以下问题,其中有一些我目前正在关注的好资源,但我很好奇为什么需要双叉.我抓住谷歌,发现有足够的资源声明一个是必要的,但不是为什么.
有人提到它是为了防止守护进程获得控制终端.没有第二个叉子怎么做呢?有什么影响?
这可能是一个愚蠢的问题,但我正在测试我对Python的一些假设,我很困惑为什么以下代码片段在线程中调用时不会退出,但在主线程中调用时会退出.
import sys, time
from threading import Thread
def testexit():
time.sleep(5)
sys.exit()
print "post thread exit"
t = Thread(target = testexit)
t.start()
t.join()
print "pre main exit, post thread exit"
sys.exit()
print "post main exit"
Run Code Online (Sandbox Code Playgroud)
sys.exit()的文档声明调用应该从Python退出.我可以从这个程序的输出中看到"post thread exit"永远不会被打印出来,但是主线程在线程调用exit之后仍然继续运行.
是否为每个线程创建了一个单独的解释器实例,而对exit()的调用只是退出该单独的实例?如果是这样,线程实现如何管理对共享资源的访问?如果我确实想要从线程中退出程序(不是我真的想要,但我只是理解)该怎么办?
在python 2.6中,以下代码:
import urlparse
qsdata = "test=test&test2=test2&test2=test3"
qs = urlparse.parse_qs(qsdata)
print qs
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
{'test': ['test'], 'test2': ['test2', 'test3']}
Run Code Online (Sandbox Code Playgroud)
这意味着即使测试只有一个值,它仍然被解析为一个列表.有没有办法确保如果只有一个值,它不会被解析成一个列表,所以结果看起来像这样?
{'test': 'test', 'test2': ['test2', 'test3']}
Run Code Online (Sandbox Code Playgroud) 根据标题,是否有PHP相当于__name__ == "__main__"
?
有什么东西适用于通过命令行和Web请求执行的脚本,还是需要自定义函数?
对于那些不熟悉Python的人来说,__name__ == "__main__"
允许你定义一个模块文件,并且如果它是入口点,还有一些允许你运行它的东西.PHP中的等效结构类似于:
// SomeClass.php
<?php
class SomeClass
{
function doStuff() {
echo "wahey!\n";
}
}
// python, I know.
if (__name__ == "__main__") {
$sc = new SomeClass;
$sc->doStuff();
}
?>
// OtherClass.php
<?php
require_once("SomeClass.php");
class OtherClass
{
public $yep;
}
?>
// command line:
php SomeClass.php // outputs "wahey!"
php OtherClass.php // outputs nothing
Run Code Online (Sandbox Code Playgroud)
注意:zerkms的答案是最好的,但是不太正确 - 它应该是:
if (!debug_backtrace()) {
// do useful stuff
}
Run Code Online (Sandbox Code Playgroud)
这比!count(debug_backtrace())快得多,它本身的速度大约是我的涉及realpath()的解决方案的两倍.
我意识到我可以很容易地用CURL做到这一点,但我想知道是否可以使用file_get_contents()
http流上下文将文件上传到远程Web服务器,如果是的话,怎么样?
我正在尝试将数据从简单的对象图转换为字典.我不需要类型信息或方法,我不需要能够再次将它转换回对象.
我发现这个问题是关于从对象的字段创建字典,但它不会递归地执行.
对于python来说相对较新,我担心我的解决方案可能是丑陋的,或者说是unpythonic,或者是以某种模糊的方式打破,或者只是简单的旧NIH.
我的第一次尝试似乎工作,直到我尝试使用列表和字典,并且检查传递的对象是否有内部字典似乎更容易,如果没有,只是将其视为一个值(而不是做所有的实例检查) ).我以前的尝试也没有递归到对象列表中:
def todict(obj):
if hasattr(obj, "__iter__"):
return [todict(v) for v in obj]
elif hasattr(obj, "__dict__"):
return dict([(key, todict(value))
for key, value in obj.__dict__.iteritems()
if not callable(value) and not key.startswith('_')])
else:
return obj
Run Code Online (Sandbox Code Playgroud)
这似乎工作得更好,不需要例外,但我仍然不确定这里是否有案例,我不知道它在哪里落下.
任何建议将不胜感激.
我正在尝试将一堆测试从SimpleTest迁移到PHPUnit,我想知道是否有一个等效的SimpleTest的部分模拟.
更新:我似乎无法在文档中找到任何暗示此功能可用的内容,但我想到我可以使用子类.这是一个好主意还是坏主意?
class StuffDoer {
protected function doesLongRunningThing() {
sleep(10);
return "stuff";
}
public function doStuff() {
return $this->doesLongRunningThing();
}
}
class StuffDoerTest {
protected function doesLongRunningThing() {
return "test stuff";
}
}
class StuffDoerTestCase extends PHPUnit_Framework_TestCase {
public function testStuffDoer() {
$sd = new StuffDoerTest();
$result = $sd->doStuff();
$this->assertEquals($result, "test stuff");
}
}
Run Code Online (Sandbox Code Playgroud) 我已经发现了以下问题,但我想知道是否有一种更快更脏的方法来获取python解释器当前用于我的脚本而不依赖于外部库的内存量的估计.
我来自PHP并且为此目的使用了memory_get_usage()和memory_get_peak_usage(),我希望能找到一个等价物.
我有一个奇怪的时间处理从大约30,000行的表中选择.
似乎我的脚本使用了大量的内存,因为这是一个简单的,仅向前遍历查询结果的内容.
请注意,这个例子是一个有点人为的,绝对的最小例子,它与真实代码几乎没有相似之处,它不能用简单的数据库聚合代替.它旨在说明每次迭代时不需要保留每一行的要点.
<?php
$pdo = new PDO('mysql:host=127.0.0.1', 'foo', 'bar', array(
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
));
$stmt = $pdo->prepare('SELECT * FROM round');
$stmt->execute();
function do_stuff($row) {}
$c = 0;
while ($row = $stmt->fetch()) {
// do something with the object that doesn't involve keeping
// it around and can't be done in SQL
do_stuff($row);
$row = null;
++$c;
}
var_dump($c);
var_dump(memory_get_usage());
var_dump(memory_get_peak_usage());
Run Code Online (Sandbox Code Playgroud)
这输出:
int(39508)
int(43005064)
int(43018120)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在任何时候几乎不需要保存任何数据时使用40兆内存.我已经解决了我可以通过用"SELECT home,away"替换"SELECT*"来减少大约6倍的内存,但是我认为即使这种用法非常高,而且表只会变得更大.
是否有我缺少的设置,或者我应该注意PDO的某些限制?我很高兴摆脱PDO而不支持mysqli,如果它不能支持这个,那么如果这是我唯一的选择,我将如何使用mysqli执行此操作呢?
有没有一种简单的方法可以将PHP关联数组封送到XML和从XML封送?例如,我有以下数组:
$items = array("1", "2",
array(
"item3.1" => "3.1",
"item3.2" => "3.2"
"isawesome" => true
)
);
Run Code Online (Sandbox Code Playgroud)
我将如何在尽可能少的行中将其转换为类似于以下XML的内容,然后再返回?
<items>
<item>1</item>
<item>2</item>
<item>
<item3_1>3.1</item3_1>
<item3_2>3.2</item3_2>
<isawesome>true</isawesome>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
我真的不在乎是否需要更改数组结构或者出现的XML与上面的示例不同.我一直在尝试使用PHP的XMLReader和XMLWriter,但是文档非常糟糕,我生成的代码看起来与我认为的样子完全不同:
$xml = SomeXMLWriter::writeArrayToXml($items);
$array = SomeXMLWriter::writeXmlToArray($xml);
Run Code Online (Sandbox Code Playgroud)
在没有编写我自己的自定义类的情况下,获取PHP数组的基本原始XML转储是否真的必须更难?
我尽量避免梨.除了我曾经遇到的配置问题之外,我从来没有坚持使用过我曾经使用过的任何软件包.
php ×5
python ×5
python-2.6 ×3
daemon ×1
file-upload ×1
mysql ×1
pdo ×1
phpunit ×1
simpletest ×1
unix ×1
xml ×1