質問編集履歴

5 エラーメッセージ追記

BURI55

BURI55 score 25

2018/11/06 16:44  投稿

Pythonでマストドンの読み上げプログラムを作っています。パーミッションエラーに悩まされています。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります。ファイル属性を読み取り専用から解除しました。
```Python
import datetime
import os
import subprocess
import xml.etree.ElementTree as ET
from getpass import getpass
from typing import NamedTuple
from mastodon import Mastodon, StreamListener
from config import generate_from_file
from utility import strip_html_tags
class Comment(NamedTuple):
   user: str
   html_text: str
   unix_time: int
   icon_url: str
   @property
   def text(self) -> str:
       return strip_html_tags(self.html_text)
def construct_execute_command(execute_command_format: str, comment: Comment):
   return execute_command_format.format(
       user=comment.user,
       text=comment.text,
       unix_time=comment.unix_time,
   )
class Runner(StreamListener):
   def __init__(self, config):
       self.config = config
       self.highlight_list = self.config.highlight
       self.path_xml = self.config.path_xml_html5_comment_generator
       self.mastodon = Mastodon(
           client_id='app.secret',
           access_token='user.secret',
           api_base_url=config.api_base_url,
       )
   def make_comment(self, toot):
       user = toot['account']['display_name']
       icon_url = toot['account']['avatar']
       text = toot['content']
       ok = False
       if self.highlight_list is None or len(self.highlight_list) == 0:
           ok = True
       for highlight in self.highlight_list:
           if highlight in text:
               ok = True
       if not ok:
           return None
       unix_time = int(datetime.datetime.now().timestamp())
       return Comment(user, text, unix_time, icon_url)
   def make_xml_element(self, root_xml, comment: Comment):
       last_no = int(list(root_xml)[-1].attrib['no'])
       attr = dict(
           no=str(last_no + 1),
           time=str(comment.unix_time + 3),
           handle=comment.user,
           icon_url=comment.icon_url,
       )
       element = ET.Element('comment', attrib=attr)
       element.text = comment.text
       return element
   def on_update(self, toot):
       comment = self.make_comment(toot)
       if comment is None:
           return
       # execute command
       for f in self.config.execute_command:
           subprocess.run(construct_execute_command(f, comment).split(' '))
       # get last number of xml
       tree = ET.parse(self.path_xml)
       root_xml = tree.getroot()
       element = self.make_xml_element(root_xml, comment)
       # add xml
       root_xml.append(element)
       tree.write(self.path_xml, encoding='utf-8')
   def run(self):
       print('running...')
       self.mastodon.stream_local(self)
path_config = "./config.json"
config = generate_from_file(path_config)
assert config.api_base_url is None or len(config.api_base_url), "config.jsonのapi_base_urlを指定してください。"
if not os.path.exists('./app.secret'):
   Mastodon.create_app(
       'nicolive-mastodon',
       api_base_url=config.api_base_url,
       to_file='app.secret',
   )
if not os.path.exists('./user.secret'):
   username = input("ユーザー名(e-mailアドレス)を入力してください... ")
   password = getpass("パスワードを入力してください... ")
   mastodon = Mastodon(
       client_id='app.secret',
       api_base_url=config.api_base_url,
   )
   mastodon.log_in(
       username,
       password,
       to_file='user.secret'
   )
runner = Runner(
   config=config,
)
runner.run()
```
実行結果とエラーメッセージ
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
Traceback (most recent call last):
 File "run.py", line 126, in <module>
   runner.run()
 File "run.py", line 95, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 82, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```
プリントデバックしています。
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
['.']
Traceback (most recent call last):
 File "run.py", line 127, in <module>
   runner.run()
 File "run.py", line 96, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 83, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```  
config.jsonをいじったところ、だいぶエラーが減ったようです。  
```cmd  
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py  
Traceback (most recent call last):  
 File "run.py", line 100, in <module>  
   config = generate_from_file(path_config)  
 File "C:\Users\user\Desktop\nicolive-mastodon-1.1.2\config\config.py", line 18, in generate_from_file  
   info = json.load(open(path, encoding='utf-8'))  
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 296, in load  
   parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)  
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads  
   return _default_decoder.decode(s)  
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode  
   obj, end = self.raw_decode(s, idx=_w(s, 0).end())  
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode  
   raise JSONDecodeError("Expecting value", s, err.value) from None  
json.decoder.JSONDecodeError: Expecting value: line 4 column 23 (char 104)  
```
  • Python 3.x

    19239 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Windows 10

    3741 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

4 エラーメッセージ編集

BURI55

BURI55 score 25

2018/11/06 16:27  投稿

Pythonでマストドンの読み上げプログラムを作っています。パーミッションエラーに悩まされています。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります。ファイル属性を読み取り専用から解除しました。
```Python
import datetime
import os
import subprocess
import xml.etree.ElementTree as ET
from getpass import getpass
from typing import NamedTuple
from mastodon import Mastodon, StreamListener
from config import generate_from_file
from utility import strip_html_tags
class Comment(NamedTuple):
   user: str
   html_text: str
   unix_time: int
   icon_url: str
   @property
   def text(self) -> str:
       return strip_html_tags(self.html_text)
def construct_execute_command(execute_command_format: str, comment: Comment):
   return execute_command_format.format(
       user=comment.user,
       text=comment.text,
       unix_time=comment.unix_time,
   )
class Runner(StreamListener):
   def __init__(self, config):
       self.config = config
       self.highlight_list = self.config.highlight
       self.path_xml = self.config.path_xml_html5_comment_generator
       self.mastodon = Mastodon(
           client_id='app.secret',
           access_token='user.secret',
           api_base_url=config.api_base_url,
       )
   def make_comment(self, toot):
       user = toot['account']['display_name']
       icon_url = toot['account']['avatar']
       text = toot['content']
       ok = False
       if self.highlight_list is None or len(self.highlight_list) == 0:
           ok = True
       for highlight in self.highlight_list:
           if highlight in text:
               ok = True
       if not ok:
           return None
       unix_time = int(datetime.datetime.now().timestamp())
       return Comment(user, text, unix_time, icon_url)
   def make_xml_element(self, root_xml, comment: Comment):
       last_no = int(list(root_xml)[-1].attrib['no'])
       attr = dict(
           no=str(last_no + 1),
           time=str(comment.unix_time + 3),
           handle=comment.user,
           icon_url=comment.icon_url,
       )
       element = ET.Element('comment', attrib=attr)
       element.text = comment.text
       return element
   def on_update(self, toot):
       comment = self.make_comment(toot)
       if comment is None:
           return
       # execute command
       for f in self.config.execute_command:
           subprocess.run(construct_execute_command(f, comment).split(' '))
       # get last number of xml
       tree = ET.parse(self.path_xml)
       root_xml = tree.getroot()
       element = self.make_xml_element(root_xml, comment)
       # add xml
       root_xml.append(element)
       tree.write(self.path_xml, encoding='utf-8')
   def run(self):
       print('running...')
       self.mastodon.stream_local(self)
path_config = "./config.json"
config = generate_from_file(path_config)
assert config.api_base_url is None or len(config.api_base_url), "config.jsonのapi_base_urlを指定してください。"
if not os.path.exists('./app.secret'):
   Mastodon.create_app(
       'nicolive-mastodon',
       api_base_url=config.api_base_url,
       to_file='app.secret',
   )
if not os.path.exists('./user.secret'):
   username = input("ユーザー名(e-mailアドレス)を入力してください... ")
   password = getpass("パスワードを入力してください... ")
   mastodon = Mastodon(
       client_id='app.secret',
       api_base_url=config.api_base_url,
   )
   mastodon.log_in(
       username,
       password,
       to_file='user.secret'
   )
runner = Runner(
   config=config,
)
runner.run()
```
実行結果とエラーメッセージ
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
Traceback (most recent call last):
 File "run.py", line 126, in <module>
   runner.run()
 File "run.py", line 95, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 82, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```
プリントデバックしています。
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py running... ['.'] Traceback (most recent call last):  File "run.py", line 127, in <module>    runner.run()  File "run.py", line 96, in run    self.mastodon.stream_local(self)  File "<decorator-gen-85>", line 2, in stream_local  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper    return function(self, *args, **kwargs)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local    return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream    listener.handle_stream(r)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream    self._dispatch(event)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch    handler(payload)  File "run.py", line 83, in on_update    subprocess.run(construct_execute_command(f, comment).split(' '))  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run    with Popen(*popenargs, **kwargs) as process:  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__    restore_signals, start_new_session)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child    startupinfo) PermissionError: [WinError 5] アクセスが拒否されました。
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
['.']
Traceback (most recent call last):
 File "run.py", line 127, in <module>
   runner.run()
 File "run.py", line 96, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 83, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```
  • Python 3.x

    19239 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Windows 10

    3741 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

3 プリントデバッグ

BURI55

BURI55 score 25

2018/11/06 16:24  投稿

Pythonでマストドンの読み上げプログラムを作っています。パーミッションエラーに悩まされています。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります。ファイル属性を読み取り専用から解除しました。
```Python
import datetime
import os
import subprocess
import xml.etree.ElementTree as ET
from getpass import getpass
from typing import NamedTuple
from mastodon import Mastodon, StreamListener
from config import generate_from_file
from utility import strip_html_tags
class Comment(NamedTuple):
   user: str
   html_text: str
   unix_time: int
   icon_url: str
   @property
   def text(self) -> str:
       return strip_html_tags(self.html_text)
def construct_execute_command(execute_command_format: str, comment: Comment):
   return execute_command_format.format(
       user=comment.user,
       text=comment.text,
       unix_time=comment.unix_time,
   )
class Runner(StreamListener):
   def __init__(self, config):
       self.config = config
       self.highlight_list = self.config.highlight
       self.path_xml = self.config.path_xml_html5_comment_generator
       self.mastodon = Mastodon(
           client_id='app.secret',
           access_token='user.secret',
           api_base_url=config.api_base_url,
       )
   def make_comment(self, toot):
       user = toot['account']['display_name']
       icon_url = toot['account']['avatar']
       text = toot['content']
       ok = False
       if self.highlight_list is None or len(self.highlight_list) == 0:
           ok = True
       for highlight in self.highlight_list:
           if highlight in text:
               ok = True
       if not ok:
           return None
       unix_time = int(datetime.datetime.now().timestamp())
       return Comment(user, text, unix_time, icon_url)
   def make_xml_element(self, root_xml, comment: Comment):
       last_no = int(list(root_xml)[-1].attrib['no'])
       attr = dict(
           no=str(last_no + 1),
           time=str(comment.unix_time + 3),
           handle=comment.user,
           icon_url=comment.icon_url,
       )
       element = ET.Element('comment', attrib=attr)
       element.text = comment.text
       return element
   def on_update(self, toot):
       comment = self.make_comment(toot)
       if comment is None:
           return
       # execute command
       for f in self.config.execute_command:
           subprocess.run(construct_execute_command(f, comment).split(' '))
       # get last number of xml
       tree = ET.parse(self.path_xml)
       root_xml = tree.getroot()
       element = self.make_xml_element(root_xml, comment)
       # add xml
       root_xml.append(element)
       tree.write(self.path_xml, encoding='utf-8')
   def run(self):
       print('running...')
       self.mastodon.stream_local(self)
path_config = "./config.json"
config = generate_from_file(path_config)
assert config.api_base_url is None or len(config.api_base_url), "config.jsonのapi_base_urlを指定してください。"
if not os.path.exists('./app.secret'):
   Mastodon.create_app(
       'nicolive-mastodon',
       api_base_url=config.api_base_url,
       to_file='app.secret',
   )
if not os.path.exists('./user.secret'):
   username = input("ユーザー名(e-mailアドレス)を入力してください... ")
   password = getpass("パスワードを入力してください... ")
   mastodon = Mastodon(
       client_id='app.secret',
       api_base_url=config.api_base_url,
   )
   mastodon.log_in(
       username,
       password,
       to_file='user.secret'
   )
runner = Runner(
   config=config,
)
runner.run()
```
実行結果とエラーメッセージ
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
Traceback (most recent call last):
 File "run.py", line 126, in <module>
   runner.run()
 File "run.py", line 95, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 82, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```  
プリントデバックしています。  
```cmd  
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py running... ['.'] Traceback (most recent call last):  File "run.py", line 127, in <module>    runner.run()  File "run.py", line 96, in run    self.mastodon.stream_local(self)  File "<decorator-gen-85>", line 2, in stream_local  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper    return function(self, *args, **kwargs)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local    return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream    listener.handle_stream(r)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream    self._dispatch(event)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch    handler(payload)  File "run.py", line 83, in on_update    subprocess.run(construct_execute_command(f, comment).split(' '))  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run    with Popen(*popenargs, **kwargs) as process:  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__    restore_signals, start_new_session)  File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child    startupinfo) PermissionError: [WinError 5] アクセスが拒否されました。  
```
  • Python 3.x

    19239 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Windows 10

    3741 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

2 追記

BURI55

BURI55 score 25

2018/11/06 16:22  投稿

Pythonでマストドンの読み上げプログラムを作っています。パーミッションエラーに悩まされています。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります。ファイル属性を読み取り専用から解除しました。
```Python
import datetime
import os
import subprocess
import xml.etree.ElementTree as ET
from getpass import getpass
from typing import NamedTuple
from mastodon import Mastodon, StreamListener
from config import generate_from_file
from utility import strip_html_tags
class Comment(NamedTuple):
   user: str
   html_text: str
   unix_time: int
   icon_url: str
   @property
   def text(self) -> str:
       return strip_html_tags(self.html_text)
def construct_execute_command(execute_command_format: str, comment: Comment):
   return execute_command_format.format(
       user=comment.user,
       text=comment.text,
       unix_time=comment.unix_time,
   )
class Runner(StreamListener):
   def __init__(self, config):
       self.config = config
       self.highlight_list = self.config.highlight
       self.path_xml = self.config.path_xml_html5_comment_generator
       self.mastodon = Mastodon(
           client_id='app.secret',
           access_token='user.secret',
           api_base_url=config.api_base_url,
       )
   def make_comment(self, toot):
       user = toot['account']['display_name']
       icon_url = toot['account']['avatar']
       text = toot['content']
       ok = False
       if self.highlight_list is None or len(self.highlight_list) == 0:
           ok = True
       for highlight in self.highlight_list:
           if highlight in text:
               ok = True
       if not ok:
           return None
       unix_time = int(datetime.datetime.now().timestamp())
       return Comment(user, text, unix_time, icon_url)
   def make_xml_element(self, root_xml, comment: Comment):
       last_no = int(list(root_xml)[-1].attrib['no'])
       attr = dict(
           no=str(last_no + 1),
           time=str(comment.unix_time + 3),
           handle=comment.user,
           icon_url=comment.icon_url,
       )
       element = ET.Element('comment', attrib=attr)
       element.text = comment.text
       return element
   def on_update(self, toot):
       comment = self.make_comment(toot)
       if comment is None:
           return
       # execute command
       for f in self.config.execute_command:
           subprocess.run(construct_execute_command(f, comment).split(' '))
       # get last number of xml
       tree = ET.parse(self.path_xml)
       root_xml = tree.getroot()
       element = self.make_xml_element(root_xml, comment)
       # add xml
       root_xml.append(element)
       tree.write(self.path_xml, encoding='utf-8')
   def run(self):
       print('running...')
       self.mastodon.stream_local(self)
path_config = "./config.json"
config = generate_from_file(path_config)
assert config.api_base_url is None or len(config.api_base_url), "config.jsonのapi_base_urlを指定してください。"
if not os.path.exists('./app.secret'):
   Mastodon.create_app(
       'nicolive-mastodon',
       api_base_url=config.api_base_url,
       to_file='app.secret',
   )
if not os.path.exists('./user.secret'):
   username = input("ユーザー名(e-mailアドレス)を入力してください... ")
   password = getpass("パスワードを入力してください... ")
   mastodon = Mastodon(
       client_id='app.secret',
       api_base_url=config.api_base_url,
   )
   mastodon.log_in(
       username,
       password,
       to_file='user.secret'
   )
runner = Runner(
   config=config,
)
runner.run()
```
実行結果とエラーメッセージ
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
Traceback (most recent call last):
 File "run.py", line 126, in <module>
   runner.run()
 File "run.py", line 95, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 82, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```
  • Python 3.x

    19239 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Windows 10

    3741 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

1 誤字の修正、追記

BURI55

BURI55 score 25

2018/11/06 15:21  投稿

Pythonでマストドンの読み上げプログラムを作っています。パーミッションエラーに悩まされています。
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可をかくにんしたりしましたが、だめでした
Pythonでマストドンの読み上げプログラムを作っています。以下のコードを実行したところ、今度はパーミッションエラーに悩まされています。これはウインドウズ特有のエラーらしく、管理者権限でコマンドプロンプトを実行したり、Pythonのインストールフォルダなどのアクセス許可を確認したりしましたが、だめでした。UACは下げてあります
```Python
import datetime
import os
import subprocess
import xml.etree.ElementTree as ET
from getpass import getpass
from typing import NamedTuple
from mastodon import Mastodon, StreamListener
from config import generate_from_file
from utility import strip_html_tags
class Comment(NamedTuple):
   user: str
   html_text: str
   unix_time: int
   icon_url: str
   @property
   def text(self) -> str:
       return strip_html_tags(self.html_text)
def construct_execute_command(execute_command_format: str, comment: Comment):
   return execute_command_format.format(
       user=comment.user,
       text=comment.text,
       unix_time=comment.unix_time,
   )
class Runner(StreamListener):
   def __init__(self, config):
       self.config = config
       self.highlight_list = self.config.highlight
       self.path_xml = self.config.path_xml_html5_comment_generator
       self.mastodon = Mastodon(
           client_id='app.secret',
           access_token='user.secret',
           api_base_url=config.api_base_url,
       )
   def make_comment(self, toot):
       user = toot['account']['display_name']
       icon_url = toot['account']['avatar']
       text = toot['content']
       ok = False
       if self.highlight_list is None or len(self.highlight_list) == 0:
           ok = True
       for highlight in self.highlight_list:
           if highlight in text:
               ok = True
       if not ok:
           return None
       unix_time = int(datetime.datetime.now().timestamp())
       return Comment(user, text, unix_time, icon_url)
   def make_xml_element(self, root_xml, comment: Comment):
       last_no = int(list(root_xml)[-1].attrib['no'])
       attr = dict(
           no=str(last_no + 1),
           time=str(comment.unix_time + 3),
           handle=comment.user,
           icon_url=comment.icon_url,
       )
       element = ET.Element('comment', attrib=attr)
       element.text = comment.text
       return element
   def on_update(self, toot):
       comment = self.make_comment(toot)
       if comment is None:
           return
       # execute command
       for f in self.config.execute_command:
           subprocess.run(construct_execute_command(f, comment).split(' '))
       # get last number of xml
       tree = ET.parse(self.path_xml)
       root_xml = tree.getroot()
       element = self.make_xml_element(root_xml, comment)
       # add xml
       root_xml.append(element)
       tree.write(self.path_xml, encoding='utf-8')
   def run(self):
       print('running...')
       self.mastodon.stream_local(self)
path_config = "./config.json"
config = generate_from_file(path_config)
assert config.api_base_url is None or len(config.api_base_url), "config.jsonのapi_base_urlを指定してください。"
if not os.path.exists('./app.secret'):
   Mastodon.create_app(
       'nicolive-mastodon',
       api_base_url=config.api_base_url,
       to_file='app.secret',
   )
if not os.path.exists('./user.secret'):
   username = input("ユーザー名(e-mailアドレス)を入力してください... ")
   password = getpass("パスワードを入力してください... ")
   mastodon = Mastodon(
       client_id='app.secret',
       api_base_url=config.api_base_url,
   )
   mastodon.log_in(
       username,
       password,
       to_file='user.secret'
   )
runner = Runner(
   config=config,
)
runner.run()
```
実行結果とエラーメッセージ
```cmd
C:\Users\user\Desktop\nicolive-mastodon-1.1.2>python run.py
running...
Traceback (most recent call last):
 File "run.py", line 126, in <module>
   runner.run()
 File "run.py", line 95, in run
   self.mastodon.stream_local(self)
 File "<decorator-gen-85>", line 2, in stream_local
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 77, in wrapper
   return function(self, *args, **kwargs)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2001, in stream_local
   return self.__stream('/api/v1/streaming/public/local', listener, run_async=run_async, timeout=timeout, reconnect_async=reconnect_async, reconnect_async_wait_sec=reconnect_async_wait_sec)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\Mastodon.py", line 2393, in __stream
   listener.handle_stream(r)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 72, in handle_stream
   self._dispatch(event)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\mastodon\streaming.py", line 145, in _dispatch
   handler(payload)
 File "run.py", line 82, in on_update
   subprocess.run(construct_execute_command(f, comment).split(' '))
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 466, in run
   with Popen(*popenargs, **kwargs) as process:
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 769, in __init__
   restore_signals, start_new_session)
 File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1172, in _execute_child
   startupinfo)
PermissionError: [WinError 5] アクセスが拒否されました。
```
  • Python 3.x

    19239 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Windows 10

    3741 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る