質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

Q&A

解決済

3回答

7005閲覧

sys.path.append()の引数について

grilled_python

総合スコア237

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

0グッド

0クリップ

投稿2018/08/05 21:23

編集2018/08/06 04:46

windows10
django 2.0.5

同じプロジェクト内でdjangoとscrapyを使用しています。
djangoのmodelなどにscrapyから接続するのにscrapyのsettings.pyに下記のコード書いています。

scrapy_app.settigs.py

python

1import os 2import sys 3import django 4 5sys.path.append('/Users/Jun/PycharmProjects/goscrapy') 6 7os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings' 8 9django.setup() 10

このままだと動くのですが、abspathを使って書こうとするとうまくいきません。

sys.path.append(os.path.dirname(os.path.abspath(''))) #os.path.dirname(os.path.abspath('')) #shellで確認 #'C:\Users\Jun\PycharmProjects' #configが見つからない sys.path.append(os.path.dirname(os.path.abspath('.'))) #os.path.dirname(os.path.abspath('')) #shellで確認 #'C:\Users\Jun\PycharmProjects' #configが見つからない sys.path.append(os.path.dirname(os.path.abspath('settings.py'))) #os.path.dirname(os.path.abspath('')) #shellで確認 #'C:\Users\Jun\PycharmProjects\goscrapy' #configが見つからない

一番下で合っていると思ったのですが、うまく動いてくれません。
sys.path.append('/Users/Jun/PycharmProjects/goscrapy')
こちらにもどすと動いてくれます。
なにか勘違いしているのでしょうか?
よろしくお願いいたします。

###追記 なにをしたいのか
scrapyをdjangoから操作したいので

How to use Scrapy with Django Application
こちらを参考にしているのですが、scrapyをデーモン化するscrapydにscrapyをデプロイする際に
sys.path.append('/Users/Jun/PycharmProjects/goscrapy')
だと上手くいきます。スクレイピングもできます。
それ以外だと上手くできません。

参考サイトの表記方法
scrapy_app/settings.py

import os import sys # DJANGO INTEGRATION sys.path.append(os.path.dirname(os.path.abspath('.'))) # Do not forget the change iCrawler part based on your project name os.environ['DJANGO_SETTINGS_MODULE'] = 'iCrawler.settings' # This is required only if Django Version > 1.8 import django django.setup() # DJANGO INTEGRATION ## Rest of settings are below ...

エラーの表示

(goscrapy) C:\Users\Jun\PycharmProjects\goscrapy\apps\scrapy_app>scrapyd-deploy Packing version 1533502405 Deploying to project "scrapy_app" in http://127.0.0.1:6800/addversion.json Server response (200): {"node_name": "DESKTOP-DJ3BDQ4", "status": "error", "message": "Traceback (most recent call last):\r\n File \"c:\users\jun\anaconda3\envs\ goscrapy\lib\runpy.py\", line 193, in _run_module_as_main\r\n \"__main__\", mod_spec)\r\n File \"c:\users\jun\anaconda3\envs\goscrapy \lib\runpy.py\", line 85, in _run_code\r\n exec(code, run_globals)\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-package s\scrapyd\runner.py\", line 40, in <module>\r\n main()\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-packages\scrapyd\ runner.py\", line 37, in main\r\n execute()\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-packages\scrapy\cmdline.py\", line 110, in execute\r\n settings = get_project_settings()\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-packages\scrapy\ \utils\project.py\", line 68, in get_project_settings\r\n settings.setmodule(settings_module_path, priority='project')\r\n File \"c:\users \jun\anaconda3\envs\goscrapy\lib\site-packages\scrapy\settings\__init__.py\", line 292, in setmodule\r\n module = import_module(modu le)\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\importlib\__init__.py\", line 126, in import_module\r\n return _bootstrap._g cd_import(name[level:], package, level)\r\n File \"<frozen importlib._bootstrap>\", line 994, in _gcd_import\r\n File \"<frozen importlib._boo tstrap>\", line 971, in _find_and_load\r\n File \"<frozen importlib._bootstrap>\", line 955, in _find_and_load_unlocked\r\n File \"<frozen imp ortlib._bootstrap>\", line 665, in _load_unlocked\r\n File \"<frozen importlib._bootstrap_external>\", line 678, in exec_module\r\n File \"<fr ozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\r\n File \"C:\Users\Jun\PycharmProjects\goscrapy\apps\scrapy_app\sc rapy_app\settings.py\", line 26, in <module>\r\n django.setup()\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-packages\d jango\__init__.py\", line 19, in setup\r\n configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)\r\n File \"c:\users\jun\anaconda 3\envs\goscrapy\lib\site-packages\django\conf\__init__.py\", line 56, in __getattr__\r\n self._setup(name)\r\n File \"c:\users\jun\ \anaconda3\envs\goscrapy\lib\site-packages\django\conf\__init__.py\", line 43, in _setup\r\n self._wrapped = Settings(settings_module) \r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\site-packages\django\conf\__init__.py\", line 106, in __init__\r\n mod = impo rtlib.import_module(self.SETTINGS_MODULE)\r\n File \"c:\users\jun\anaconda3\envs\goscrapy\lib\importlib\__init__.py\", line 126, in imp ort_module\r\n return _bootstrap._gcd_import(name[level:], package, level)\r\n File \"<frozen importlib._bootstrap>\", line 994, in _gcd_imp ort\r\n File \"<frozen importlib._bootstrap>\", line 971, in _find_and_load\r\n File \"<frozen importlib._bootstrap>\", line 941, in _find_and _load_unlocked\r\n File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\r\n File \"<frozen importlib._bootstrap>\", line 994, in _gcd_import\r\n File \"<frozen importlib._bootstrap>\", line 971, in _find_and_load\r\n File \"<frozen importlib._bootstrap>\", l ine 953, in _find_and_load_unlocked\r\nModuleNotFoundError: No module named 'config'\r\n"}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

なにか勘違いしているのでしょうか?

という質問ですが、あなたがどういう風に動作すると思っているのか、どういう動作をさせたいのかを書いてくれない限り、指摘のしようがありませんよ。

ということでコードの解説だけにとどめます。

os.path.abspathの説明を読んでみましょう。
https://docs.python.jp/3/library/os.path.html#os.path.abspath

ほとんどのプラットフォームでは、これは関数 normpath() を次のように呼び出した時と等価です: normpath(join(os.getcwd(), path))。

os.path.abspath('')os.path.normpath(os.path.join(os.getcwd(), ''))と(たいていは)等価なのです。


os.getcwd()現在の作業ディレクトリを表します。

os.path.join(os.getcwd(), '') は、「最後の部分が空文字列の場合に限り区切り文字で終わる文字列になります」と、joinの説明に明記してあります。
os.getcwd()が'C:\Users\Jun\PycharmProjects\goscrapy'を返してきたら、os.path.join(os.getcwd(), '')は'C:\Users\Jun\PycharmProjects\goscrapy'になるってことです。

これをos.path.normpathに通すと余分な区切り文字が落ちて、'C:\Users\Jun\PycharmProjects\goscrapy'になります。

あとはos.path.dirnameです。「これは関数 split() に path を渡した時に返されるペアの 1 番めの要素です。」と書いてあります。

なのでos.path.splitの説明を見ます。「パス名 path を (head, tail) のペアに分割します。 tail はパス名の構成要素の末尾で、 head はそれより前の部分です。
os.path.split('C:\Users\Jun\PycharmProjects\goscrapy')は('C:\Users\Jun\PycharmProjects', 'goscrapy') を返すってことです。

その1番目の要素がos.path.dirnameの返り値でしたね。


結論
カレントディレクトリが C:\Users\Jun\PycharmProjects\goscrapy なら、
os.path.dirname(os.path.abspath(''))の返り値は'C:\Users\Jun\PycharmProjects'

です。

全部、Pythonのドキュメントを読んでいけばわかることです。

投稿2018/08/06 00:23

quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grilled_python

2018/08/06 04:53

回答ありがとうございます。 sys.path.append(os.path.dirname(os.path.abspath(''))) sys.path.append(os.path.dirname(os.path.abspath('.'))) sys.path.append(os.path.dirname(os.path.abspath(__fiile__))) なども試してみたのですが、やはりエラー ModuleNotFoundError: No module named 'config'\r\n" と返ってきてしまします。
quickquip

2018/08/06 05:01

回答読んでます?
grilled_python

2018/08/06 05:48

細かいところまで本当にありがとうございます。 sys.path.append(os.path.dirname(os.path.abspath('../'))) こちらで動きました!ありがとうございます。
quickquip

2018/08/06 05:53

なんで os.path.dirname を使うんですか?
grilled_python

2018/08/06 05:56

sys.path.append(os.path.abspath('../')) のみだと同じエラーが出てしまします。 ModuleNotFoundError: No module named 'config'\r\n"}
grilled_python

2018/08/06 06:00 編集

同じ発言を2回したので消します。
quickquip

2018/08/06 06:09

2つ上のディレクトリを指定するなら、os.path.abspath('../../') じゃないかと。1ヶ月後に見て os.path.dirname を何をしているか思い出せるならいいんですけど。
grilled_python

2018/08/06 06:15

ありがとうございます。そのように書くのがいいのですね。 os.path.dirnameとos.path.abspathについてもう少し調べてみたいと思います。 os.getcwd()ここら辺も知らなかったので勉強になりました。
guest

0

おつかいのOSはなんでしょう

sys.path.append('/Users/Jun/PycharmProjects/goscrapy')

これをみるとWindowsではないと推察されますが、

#shellで確認 #'C:\Users\Jun\PycharmProjects' #configが見つからない

これをみるとWindowsのパスとなってしまってます
どっちなんでしょうか

投稿2018/08/05 22:46

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grilled_python

2018/08/06 03:25

回答ありがとうございます。 windows10になります。質問にosを追加いたしました。 情報が少なくて申し訳ありません。
y_waiwai

2018/08/06 03:27

なら'/Users/Jun/PycharmProjects/goscrapy' というパスは間違ってますね
grilled_python

2018/08/06 04:48

つまりwindowsのパスではないのに動いているということでしょうか?
y_waiwai

2018/08/06 04:56

たまたま動いてるだけ、なんでしょう そこを、 'C:/Users/Jun/PycharmProjects/goscrapy' にしてみればどうでしょう で、質問の内容から 'C:\Users\Jun\PycharmProjects' では、後尾の goscrapy が抜けてますね
grilled_python

2018/08/06 05:11

ご指摘ありがとうございます。 sys.path.append('C:/Users/Jun/PycharmProjects/goscrapy') だと動いてくれました!
grilled_python

2018/08/06 05:48

sys.path.append(os.path.dirname(os.path.abspath('../'))) こちらで動きました!ありがとうございます。
guest

0

os.path.abspath('')'/Users/Jun/PycharmProjects/goscrapy'を返すのかを、まずは確認すると良いと思います。もし違っていたらos.path.abspath('.')が意図する値を返すんじゃないかと推測します。もしくはos.path.abspath(os.path.dirname(__file__))あたりかも。

投稿2018/08/05 21:46

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grilled_python

2018/08/06 05:48

sys.path.append(os.path.dirname(os.path.abspath('../'))) こちらで動きました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問