作者clsmbstu (missing)
看板Python
标题[问题] 请问为何os.getcwd()不总在sys.path内?
时间Mon Jun 18 00:40:03 2018
假设我有一个资料夹(helloworld)在桌面上,结构如下:
helloworld
|--say_hello.py
|--another_hello
|--import_hello.py
say_hello.py:
```python
def hello_world():
print("Hello World!")
if __name__ == "__main__":
hello_world()
```
import_hello.py:
```python
import os
print(os.getcwd())
print(os.listdir())
# import sys
# sys.path.append(".")
import say_hello
say_hello.hello_world()
```
这时候,如果我在helloworld资料夹里执行`python another_hello/import_hello.py`,
会得到:
/Users/clsmbstu/Desktop/helloworld
['__pycache__', 'another_hello', 'say_hello.py']
Traceback (most recent call last):
File "another_hello/import_hello.py", line 5, in <module>
import say_hello
ModuleNotFoundError: No module named 'say_hello'
一旦我把import_hello.py里面那两行un-comment,
我就可以得到我的预期结果("Hello World!"),
但我仍然有两个问题觉得很困惑:
1. 明明cwd (current working directory)是helloworld/,
os.listdir()也有找到say_hello.py,
为什麽会有ModuleNotFoundError,
反而还要把cwd加进sys.path里?
这有点违反我的直觉...
还是cwd是呼叫的位置、sys.path是被呼叫的py档的位置?
2. 即使用了sys.path.append("."),我仍然担心这不是个好解法,
因为一旦我从别的资料夹呼叫import_hello.py,
一样会发生ModuleNotFoundError。
有没有什麽办法,是可以无论我在哪里呼叫import_hello.py,
Python都知道要「去import_hello.py的上一层目录寻找say_hello模组」?
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.121.6.93
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1529253606.A.05E.html
※ 编辑: clsmbstu (122.121.6.93), 06/18/2018 00:45:35
2F:→ clsmbstu: 谢谢,但这似乎只适用於package内? 06/18 10:28
3F:→ clsmbstu: 我的案例并没有__init__.py 06/18 10:30
4F:→ clsmbstu: 而且即使我把所有资料夹都加了一个__init__.py 06/18 10:33
5F:→ clsmbstu: 然後在import_hello里面写 from .. import say_hello 06/18 10:34
6F:→ clsmbstu: ValueError: attempted relative import beyond 06/18 10:34
7F:→ clsmbstu: top-level package 06/18 10:35
8F:→ clsmbstu: 会有这样的错误回传 06/18 10:35
9F:→ ThxThx: 我蛮好奇,有什麽理由要把script和package放在一起吗 06/18 19:46
10F:→ ThxThx: 就连手动加进sys.path也是不好的手段 06/18 19:46
11F:→ clsmbstu: 那个script是package自我检测的工具 @@ 06/21 17:59