Or if your going to do mass redirecting dont do it in the program, use
terminal redirecting like > to do it in a sane manor

On Tue, Jun 24, 2014 at 6:02 PM, Jonathan Goble <[email protected]> wrote:

> I found the cause. I have several functions that are used by multiple
> scripts, so I have those in a custom module that each of my scripts
> imports. I recently added a subclass of catlib.Category to that module for
> use in a new script that will only run a couple times per month. To do
> that, I had to import pywikibot and catlib to that module, and it was the
> addition of those imports that broke things.
>
> The reason is that that module also contained a subclass of StringIO that
> handles mixed str/unicode input better, and therefore I had to import it
> before I could redirect stdout and stderr to an instance of that class. In
> performing that import, the code in the module was run, which caused
> pywikibot to be imported, and pywikibot assigned the then-current stdout
> and stderr to pywikibot.ui. The subsequent redirection of stdout and stderr
> was then not reflected in pywikibot.ui, resulting in pywikibot.output()
> sending everything to the console instead of my StringIO subclass instance.
>
> To fix it, I copied my StringIO subclass into one of my scripts proper,
> and made sure to redirect stdout and stderr before importing pywikibot or
> any other module that would import pywikibot. Subsequent tests successfully
> sent all output to my email.
>
> Moral of the story: if you're going to redirect stdout and stderr by
> simply importing sys and reassigning sys.stdout and sys.stderr to something
> else, make sure to do it BEFORE you import pywikibot or any module that
> would import pywikibot. (Although it does kinda seem like a bug that
> pywikibot doesn't respond to future changes to sys.stdout and sys.stderr;
> maybe the output function in the interface class should check whether
> either of those has changed, and adjust its setup as needed?)
>
> Jonathan Goble
>
>
> On Tue, Jun 24, 2014 at 5:25 AM, Merlijn van Deen <[email protected]>
> wrote:
>
>> Could you provide a minimal example that would allow us to reproduce the
>> issue? With core, the following works for me (I don't have compat
>> installed):
>>
>>
>> import sys, StringIO
>> oldstderr = sys.stderr
>> oldstdout = sys.stdout
>>
>> sys.stderr = sys.stdout = StringIO.StringIO()
>> sys.stderr.fileno = lambda: 10
>>
>> import pywikibot
>>  oldstdout.write("Before output\n")
>> pywikibot.output('test')
>>
>> oldstdout.write("After output; this is in our buffer:\n")
>> sys.stderr.seek(0)
>> oldstdout.write(repr(sys.stderr.read()))
>>
>>
>> $ PYWIKIBOT2_DIR=. python test.py
>> Before output
>> After output; this is in our buffer:
>> 'WARNING: Running on Windows and transliteration_target is not
>> set.\nPlease see
>>
>> https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Pywikibot/Windows\ntest
>> \n'
>>
>>
>>
>> Nonetheless, I would suggest to use normal shell redirection techniques,
>> instead of monkey-patching python's sys module. If you want to use python,
>> the following should work (untested):
>>
>> import subprocess
>> stdout, stderr = subprocess.Popen(["c:\python27\python", "pwb.py"],
>> stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
>> # do something with stdout and stderr
>>
>> I *think* it should also be possible to do this with the logging module,
>> but I'm not sure how to do that in a quick-and-easy way.
>>
>> Merlijn
>>
>> On 24 June 2014 09:52, Jonathan Goble <[email protected]> wrote:
>>
>>> When the error began occurring, I was using the Pywikibot nightly dump
>>> from February 25 of this year. It continues to occur with the nightly dump
>>> from yesterday (June 23). I just tried the fileno = lambda: 10 trick and it
>>> had no effect.
>>>
>>> As for core, it's been four months since I last tried it so I don't
>>> recall the issues. It's past bedtime for me right now, but I'll look into
>>> giving it another try within the next day or two when I have some time.
>>>
>>>
>>> On Tue, Jun 24, 2014 at 3:17 AM, Merlijn van Deen <[email protected]>
>>> wrote:
>>>
>>>> On 24 June 2014 06:17, Jonathan Goble <[email protected]> wrote:
>>>>
>>>> I've given up trying to solve a bug that popped up in my scripts a
>>>>> couple days ago. I run a bot for Wookieepedia, over at Wikia, and run 
>>>>> three
>>>>> simple scripts on a daily basis. They are set up to run automatically
>>>>> through Windows Task Scheduler. Since they run automatically, they run in
>>>>> the background through pythonw.exe, i.e. without a console, and therefore 
>>>>> I
>>>>> need a means of getting the output. My solution for the past two months 
>>>>> has
>>>>> been to redirect sys.stdout and sys.stderr to the same StringIO() 
>>>>> instance,
>>>>> then at the end call getvalue() on that and email it to myself.
>>>>>
>>>>
>>>> Could it be you haven't updated in a few years? It sounds like it's
>>>> related to a feature that I added two or three years ago, that allowed
>>>> Windows users to get full unicode out- and input. However, that does mean
>>>> sys.stdin and sys.stdout are no longer being used. We /do/ check whether
>>>> the user has redirected the output using normal shell redirection, but your
>>>> method doesn't do that.
>>>>
>>>> There are a two options I can think of.
>>>>   - use normal shell redirection, e.g.
>>>> https://stackoverflow.com/questions/8662024/how-do-i-capture-the-output-of-a-script-if-it-is-being-ran-by-the-task-scheduler
>>>>
>>>>   - trick the code into thinking you're doing 'regular' redirection by
>>>> adding a fileno function to your streams:
>>>>     see
>>>> https://github.com/wikimedia/pywikibot-compat/blob/master/userinterfaces/win32_unicode.py#L92
>>>>
>>>>     you'd need something like x = StringIO.StringIO(); x.fileno =
>>>> lambda: 10
>>>>     and the same for stdout.
>>>>
>>>>  (By the way, the answer is NOT "switch to core". I have tried to get
>>>>> core to run on my system and failed miserably after two hours of repeated
>>>>> attempts without even getting it to talk to the wiki. Compat worked
>>>>> perfectly on the first try. Until such time as core can be installed by a
>>>>> beginner, it is not for me.)
>>>>>
>>>>
>>>> I would appreciate it if you could clarify what the issues were you ran
>>>> into.
>>>>
>>>> Merlijn
>>>>
>>>>
>>>> _______________________________________________
>>>> Pywikipedia-l mailing list
>>>> [email protected]
>>>> https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Pywikipedia-l mailing list
>>> [email protected]
>>> https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l
>>>
>>>
>>
>> _______________________________________________
>> Pywikipedia-l mailing list
>> [email protected]
>> https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l
>>
>>
>
> _______________________________________________
> Pywikipedia-l mailing list
> [email protected]
> https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l
>
>
_______________________________________________
Pywikipedia-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikipedia-l

Reply via email to